繁体   English   中英

在 PHP 中格式化 JSON 格式的文本文件

[英]Formatting JSON formatted text file in PHP

所以我得到了一个带有按钮的 HTML 页面。 当我单击按钮时,一个单独的 javascript 文件向我的 PHP 文件发送一个 GET 请求,期望返回一个 JSON 对象。 我的 PHP 读取一个 JSON 格式的文本文件,并且应该将它转换为一个 JSONObject 并为我的 javascipt 回显出来。 我之前有一些代码可以工作,但是自从我改用 Ajax 方法而不是将所有内容都放在同一个文件中后,它似乎不再这样做了。 这是我的代码:

读取日志文件

<?php
class test{

function clean($string){
    return json_decode(rtrim(trim($string),','),true);
}

function getLog(){
    header('Content-Type: application/json');
    $logLines = file('../../../home/shares/flower_hum/humid.log');
    $entries = array_map("clean",$logLines);
    $finalOutput = ['log'  => $entries];
    echo json_encode($logLines);

}
}
 ?>

我的 humb.log 文件如下所示:

{"date":"26/09/2016", "time":"22:40:46","temp":"16.0", "humidity":"71.0" }     
{"date":"26/09/2016", "time":"23:10:47","temp":"16.0", "humidity":"71.0" }

现在,如果我按下按钮,这是我在 Web 浏览器中检查控制台时得到的响应:

回复:

["{\"date\":\"26\/09\/2016\", \"time\":\"22:40:46\",\"temp\":\"16.0\", \"humidity\":\"71.0\" }{\"date\":\"26\/09\/2016\", \"time\":\"23:10:47\",\"temp\":\"16.0\", \"humidity\":\"71.0\" }\n"]

JSON:

"{"date":"26/09/2016", "time":"22:40:46","temp":"16.0", "humidity":"71.0" }{"date":"26/09/2016", "time":"23:10:47","temp":"16.0", "humidity":"71.0" }\n"

显然格式有问题,但我不知道是什么。 正如我所说,当我将 php 和 HTML 放在同一个文件中时,这段代码工作得很好。

编辑:

我也试过用这样的东西格式化 JSON,但它只打印括号:

function getLog(){
    $text = file('../../../home/shares/flower_hum/humid.log');
    $textRemoved ="["; //Add opening bracket.
    $textRemoved .= substr($text, 0, strlen($text)-1); (Remove last comma)
    $textRemoved .="]";//Add closing bracket
    $json = json_encode($textRemoved);
    echo $json;
}

所以我设法自己解决了它。 基本上文本文件的格式是错误的,正如一些评论者所说,如果我自己做的话,我不需要对其进行编码。 我最终做的是在我的应用程序中生成日志文件以在每一行后添加逗号。 然后在我的 PHP 中,我添加了括号并删除了最后一个逗号。

function getLog(){
    header('Content-Type: application/json');
    $file = file_get_contents('../../../home/shares/flower_hum/humid.log');
    $lengthOfFile = strlen($file)-2;
    $subFile = substr($file, 0, $lengthOfFile);
    $res ="[";
    $res .= $subFile;
    $res .="]";
    echo $res;
}

你不能只是把两个以上的 JSON 字符串塞在一起。 它是 JSON,这意味着它必须是语法正确的 Javascript CODE 如果要将两个 json 字符串连接在一起,则必须将它们解码为原生数据结构,将这些结构连接在一起,然后重新编码新的合并结构:

$temp1 = json_decode('{"foo":"bar"}', true);
$temp2 = json_decode('{"baz":"qux"}', true);

$new = array_merge($temp1, $temp2);
echo json_encode($new);

这将产生:

{"foo":"bar","baz":"qux"}

并保持有效的 JSON/Javascript。

为什么? 考虑到裸整数是有效的 json:

json_encode(42) -> 42
json_encode(123) -> 123

如果你有两个 json 编码的整数并且塞在一起,你会得到一个“新”整数:

 42123

在接收端,你会说“好吧,两者之间的分歧在哪里”,因为4212342123原始值一样有效。

将两个整数作为不同的和 SEPARATABLE 值发送将需要一个数组:

[42,123]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM