2016-09-26 130 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]