2016-09-26 3 views
2

So bekam ich eine HTML-Seite mit einer Schaltfläche. Wenn ich auf die Schaltfläche klicke, sendet eine separate Javascript-Datei eine GET-Anfrage an meine PHP-Datei und erwartet dafür ein JSON-Objekt. Mein PHP liest eine JSON-formatierte Textdatei und sollte sie in ein JSONObject konvertieren und für mein Javascipt ausgeben. Ich hatte etwas Code, der vorher arbeitete, aber es scheint es nicht mehr zu tun, seit ich zu einem Ajax-Ansatz gewechselt habe, anstatt alles in der gleichen Datei zu haben. Dies ist mein Code:Formatieren von JSON formatierte Textdatei in PHP

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

} 
} 
?> 

Meine humid.log Datei sieht wie folgt aus:

{"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" } 

Jetzt Wenn ich meine Taste drücken, das ist die Antwort, die ich bekommen Überprüfung der Konsole in meinem Webbrowser:

Antwort:

["{\"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" 

offensichtlich etwas falsch mit der Formatierung, aber ich weiß nicht, was. Wie gesagt, dieser Code hat gut funktioniert, als ich meinen PHP und HTML in der gleichen Datei hatte.

EDIT:

Ich habe auch versucht, die JSON mit so etwas Formatierung, aber es druckt nur die Klammern:

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

Können Sie Ihre HTML veröffentlichen, die auch die AJAX JS enthält? – Ma3x

+3

Es sieht so aus, als ob Sie 'json_encode()' in 'feuchte.log', das ist bereits JSON, enthalten sind und es ausdrucken (Sie kodieren bereits kodierte Daten). Ich sollte jedoch darauf hinweisen, dass die oben genannten "feuchte.log" Inhalte nicht gültig sind JSON. Wenn es sich um ein Array von Objekten handelt, sollten diese durch ein Komma getrennt und in Klammern eingeschlossen werden ('[{obj_1}, {obj_2}]'). –

+0

Ich denke, ein Teil des Problems besteht auch darin, dass Sie "$ logLines" anstelle von "$ entries" oder "$ finalOutput" codieren. – Ma3x

Antwort

1

So gelang es mir, es selbst zu lösen. Grundsätzlich Die Formatierung der Textdatei war falsch und wie einige Kommentatoren sagten, muss ich sie nicht verschlüsseln, wenn ich es selbst mache. Was ich getan habe, war in meiner Anwendung, die die Protokolldatei generiert, um nach jeder Zeile ein Komma hinzuzufügen. Dann habe ich in meinem PHP Klammern hinzugefügt und das letzte Komma entfernt.

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

Sie können nicht nur zwei + JSON-Strings aneinander klemmen. Es ist JSON, was bedeutet, es muss syntaktisch korrekt sein Javascript CODE. Wenn Sie zusammen zwei json Strings anschließen möchten, müssen Sie sie mit einer nativen Datenstruktur entschlüsseln, verbinden diese Strukturen zusammen, dann wieder kodieren die neue fusionierte Struktur:

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

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

, die produzieren:

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

und bleiben gültig JSON/Javascript.

Warum? Man bedenke, dass nackte Zahlen gelten json:

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

Wenn Sie zwei json-codierte Zahlen und Marmelade zusammen haben, erhalten Sie eine „neue“ integer:

42123 

und am empfangenden Ende, Sie‘ lch werde "Ok, also wo ist die Aufteilung zwischen den beiden", denn 4 und 2123 sind genauso gültige Originalwerte wie 4212 und 3.

Senden der zwei ganzen Zahlen als deutliche und abtrennbare Werte würden eine Reihe erfordern:

[42,123]