2012-12-19 11 views
7

poznałem naprawdę dziwny problem na json_decode, z tym kodem:json_decode zwraca NULL na sznurku zmiennej

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

Mam następujący wynik:

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

Wydaje się, że nie mogę json_decode to strunowy. Jednak, kiedy zrobić tak (kopiowanie wyjście ciąg powyżej i umieścić go bezpośrednio do $ string):

$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 działa. Dlaczego json_decode uzyskuje NULL w pierwszej części, podczas gdy działa tutaj poprawnie?

+3

Sprawdź, czy w wierszu znajduje się BOM (znacznik kolejności bajtów) –

+0

Być może odpowiedź zawiera znak końca linii? –

+0

Spróbuj 'print_r ($ string)' zamiast 'echo $ string' –

Odpowiedz

4

Twój kod wygląda w porządku, więc weźmy jeden krok bliżej i zbadać co $output jest naprawdę. Pomaga wybrać reprezentację, która może obsługiwać zakresy ASCII, których nie widać.

echo bin2hex($output); 

To da ogromny łańcuch, ale będziesz zainteresowany głównie w przedniej i tylnej części łańcucha.

Jeśli to wydaje koszerna, można utworzyć w między reprezentacji:

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

Zastępuje dowolny znak w mniejszym lub większym zakresie ASCII z systemu szesnastkowego, co nieco łatwiej je dostrzec :)

Aktualizacja

ze swojego dochodzenia na podstawie powyższego ciąg wydaje się zawierać znak powrotu karetki - \r - gdzieś w połowie dle.

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

Można usunąć te z preg_replace() jeśli nie może być rozwiązany w inny sposób.

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

To usuwa \r nie następuje \n.

+0

Jest pewna różnica w środku: 370d222c vs 3720222c – user570494

+1

@ user570494 Nie wiem, dlaczego masz powrocie karetki w środku, ale może to powodować problemy ... Zaktualizowałem moją odpowiedź hackish solution .. it's lepiej wiedzieć, dlaczego solr daje ci ten wynik w pierwszej kolejności. –

+0

'preg_replace ("/\ r (?! \ N)/", '', $ output);' działa! Dziękuję bardzo! – user570494

3

Mogą wystąpić pewne NULL bajty w ciągu

usunąć go za pomocą

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

zmienić typ zawartości do JSON na tej stronie http://localhost:8983/solr/db/select?wt=json&rows=1&q=94305

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

Usuń BOM (Byte znak Order)

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

Sprawdź, czy wystąpił błąd podczas analizowania danych json

$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

Nie wydrukowano żadnego komunikatu o błędzie. Po prostu "Ostatni błąd:". – user570494

+0

Próbowano '$ string = trim ($ string," \ x0 ");', bez powodzenia. – user570494

+0

Próbowałem go na innym serwerze, otrzymałem komunikat "Last error: Syntax error" – user570494

Powiązane problemy