2012-12-19 72 views
7

我會見了json_decode一個很奇怪的問題返回NULL,使用此代碼:json_decode變量字符串

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

我得到了以下結果:

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

看來我不能json_decode這串。但是,當我做這樣的(複製上面的串的輸出,並直接把它放到$字符串):

$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工作。爲什麼json_decode在第一部分獲得NULL而在這裏正常工作?

+3

檢查字符串中的BOM(字節順序標記) –

+0

也許響應在最後包含換行符? –

+0

嘗試'print_r($ string)'而不是'echo $ string' –

回答

4

您的代碼看起來不錯發生錯誤,因此讓我們更近了一步,並調查什麼$output真的是。它有助於選擇一個可以處理你看不到的ASCII範圍的表示。

echo bin2hex($output); 

這將給一個巨大的字符串,但你會主要在字符串的前面和後面感興趣。

如果這看起來潔淨,你可以創建一個在中間的表示:

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

它將替換更低或更高的ASCII範圍內以十六進制表示的任何字符,使得它比較容易辨認它們:)

更新

從你的調查基於上述,您的字符串似乎包含一個回車 - 在中某處 - \r DLE。

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

您可以刪除那些具有preg_replace()如果不能以另一種方式來解決。

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

,去除任何\r後面沒有\n

+0

中間有一些區別:370d222c vs 3720222c – user570494

+1

@ user570494不確定爲什麼你在中間有一個回車符,但它可能會導致問題...我用一個黑客解決方案更新了我的答案..它是更好地知道爲什麼solr首先給你這樣的結果。 –

+0

'preg_replace(「/ \ r(?!\ n)/」,'',$ output);'工作!非常感謝! – user570494

3

可能有一些空字節的字符串中

使用

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

更改內容類型爲JSON這個網頁上刪除它http://localhost:8983/solr/db/select?wt=json&rows=1&q=94305

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

刪除BOM(字節順序標記)

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

檢查在解析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

它沒有打印任何錯誤消息。只是「最後的錯誤:」。 – user570494

+0

試過'$ string = trim($ string,「\ x0」);',沒有運氣。 – user570494

+0

我在另一臺服務器上試過了,它得到了「最後一個錯誤:語法錯誤」 – user570494