2012-12-19 17 views
7

ich ein wirklich seltsam Problem auf json_decode traf, mit diesem Code:json_decode gibt NULL für eine String-Variable

$url="http://localhost:8983/solr/db/select?wt=json&rows=1&q=94305"; 
$string=file_get_contents($url); 
echo $string; echo '<br><br>'; 
$json=json_decode($string); 
var_dump($json); 

Ich habe folgendes Ergebnis:

{"responseHeader":{"status":0,"QTime":0,"params":{"q":"94305","wt":"json","rows":"1"}},"response":{"numFound":165,"start":0,"docs":[{"price":"","tags":"ATMs","phone_n":"","location":"37.42409897,-122.1709976 ","store":"Discover ATM","store_id":"478602","state":"CA","latitude":"37.42409897","address":"459 LAGUNITA","zipcode_n":"94305","longitude":"-122.1709976\r","url":"Discover_ATM_459_LAGUNITA_Stanford_CA_94305","city":"Stanford","category":"ATMs","text":["","CA","459 LAGUNITA","94305","Stanford"],"spell":["Discover ATM"]}]}} 

NULL 

Es scheint, dass ich das nicht json_decode kann Zeichenfolge. Allerdings, wenn ich tun, wie diese (kopieren Sie die Ausgabe der Zeichenfolge oben und es zu $ ​​string setzen direkt):

$string='{"responseHeader":{"status":0,"QTime":0,"params":{"q":"94305","wt":"json","rows":"1"}},"response":{"numFound":165,"start":0,"docs":[{"price":"","tags":"ATMs","phone_n":"","location":"37.42409897,-122.1709976 ","store":"Discover ATM","store_id":"478602","state":"CA","latitude":"37.42409897","address":"459 LAGUNITA","zipcode_n":"94305","longitude":"-122.1709976\r","url":"Discover_ATM_459_LAGUNITA_Stanford_CA_94305","city":"Stanford","category":"ATMs","text":["","CA","459 LAGUNITA","94305","Stanford"],"spell":["Discover ATM"]}]}}'; 
$json=json_decode($string); 
var_dump($json); 

json_decode arbeitet. Warum json_decode wird im ersten Teil NULL, während es hier richtig funktioniert?

+3

Suchen nach Stückliste (Byte Order Mark) in der Zeichenfolge –

+0

Vielleicht enthält die Antwort einen Zeilenumbruch am Ende? –

+0

Probieren Sie 'print_r ($ string)' anstelle von 'echo $ string' aus –

Antwort

4

Ihr Code sieht gut in das Parsen, also lassen Sie uns einen Schritt näher nehmen und untersuchen, was $output wirklich ist. Es hilft, eine Darstellung zu wählen, die mit ASCII-Bereichen umgehen kann, die Sie nicht sehen können.

Das wird eine riesige Saite ergeben, aber Sie werden vor allem an der Vorder- und Rückseite der Saite interessiert sein.

Wenn das koscher scheint, können Sie eine Zwischendarstellung erstellen:

echo preg_replace('@[\x00-\x1f\x7f-\xff]@e', '" (0x" . dechex(ord("\\0")) . ") "', $output); 

in jeden Charakter in dem niedrigeren oder höheren ASCII-Bereich mit einer hexadezimalen Darstellung ersetzt, so dass es etwas leichter, sie zu entdecken :)

aktualisieren

Von Ihrer Untersuchung auf der Grundlage der oben scheint die Zeichenfolge einen Wagenrücklauf zu enthalten - \r - irgendwo in der Mitte dle.

"CA","latitude":"37.42409897"," 
          ^

Sie können diejenigen mit einem preg_replace() entfernen, wenn sie nicht auf andere Weise gelöst werden können.

preg_replace("/\r(?!\n)/", '', $output); 

dass jede \r entfernt nicht von einem \n gefolgt.

+0

Es gibt einen Unterschied in der Mitte: 370d222c vs 3720222c – user570494

+1

@ user570494 Nicht sicher, warum Sie einen Wagenrücklauf in der Mitte haben, aber es könnte Probleme verursachen ... Ich habe meine Antwort mit einer haschischen Lösung aktualisiert .. es ist besser zu wissen, warum solr dir dieses ergebnis gibt. –

+0

'preg_replace ("/\ r (?! \ N)/", '', $ Ausgabe);' funktioniert! Ich danke dir sehr! – user570494

3

Es kann einige NULL-Bytes in der Zeichenfolge

es entfernen

$string = trim($string, "\x0"); 
$json=json_decode($string); 
var_dump($json); 

Ändern Sie den Inhaltstyp mit auf dieser Seite JSon http://localhost:8983/solr/db/select?wt=json&rows=1&q=94305

header('Content-type:application/json; charset=utf-8'); 

entfernen BOM (Bytereihenfolgemarkierung)

if (substr($string, 0,3) == pack("CCC",0xef,0xbb,0xbf)) { 
$string = substr($string, 3); 
} 
wenn Fehler

prüfen aufgetreten, die JSON-Daten

$json_errors = array(
     JSON_ERROR_NONE => 'No error has occurred', 
     JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', 
     JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', 
     JSON_ERROR_SYNTAX => 'Syntax error', 
     ); 
     echo 'Last error : ', 

$json_errors[json_last_error()], PHP_EOL, PHP_EOL; 
+0

Es wurde keine Fehlermeldung gedruckt. Nur "Letzter Fehler:". – user570494

+0

Versuchte '$ string = trim ($ string," \ x0 ");', kein Glück. – user570494

+0

Ich habe es auf einem anderen Server versucht, es wurde "Letzter Fehler: Syntaxfehler" – user570494