2016-09-26 131 views
2

所以我得到了一个带有按钮的HTML页面。当我点击按钮时,一个单独的javascript文件向我的PHP文件发送一个GET请求,期待返回一个JSON对象。我的PHP读取JSON格式的文本文件,并将其转换为JSONObject并将其回送给我的javascipt。我之前有一些代码可以工作,但是由于我改为使用Ajax方法,而不是将所有内容都放在同一个文件中,所以它似乎不再适用。这是我的代码:在PHP中格式化JSON格式的文本文件

readLog.php

<?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); 

} 
} 
?> 

我humid.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" } 

现在,如果我按下按钮,这是我得到的回应检查控制台在网页浏览器:

响应:

["{\"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; 
} 
+0

您可以发布您的HTML包含AJAX JS呢? – Ma3x

+3

它看起来就像'json_encode()'''humid.log',它已经是JSON,并且打印出它(你正在编码已经编码的数据)。尽管我应该指出上面发布的'humid.log'内容不是有效的JSON。如果它是一个对象数组,它们应该用逗号分隔并用方括号('[{obj_1},{obj_2}]')封装。 –

+0

我认为问题的一部分还在于你正在编码'$ logLines'而不是'$ entries'或'$ finalOutput'。 – Ma3x

回答

1

所以我设法解决它自己。基本上文本文件的格式是错误的,正如一些评论者所说,如果我自己做,我不需要对它进行编码。我最终做的是在我的应用程序中生成日志文件,在每行之后添加逗号。然后在我的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; 
} 
1

你不能只将两个+ JSON字符串堵塞。它是JSON,这意味着它必须在语法上正确Javascript 代码。如果你想连接两个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的原始值一样有效,所以我会继续“好的,那么两者之间的分隔在哪里”。

发送两个整数作为独特和可分离值将需要一个数组:

[42,123]