2017-05-07 87 views
1

我有以下的代碼轉換JSON到數組:的Json空數組json_decode

$str = file_get_contents('http://localhost/data.json'); 
$decodedstr = html_entity_decode($str); 
$jarray = json_decode($decodedstr, true); 


echo "<pre>"; 
print_r($jarray); 
echo "</pre>"; 

但我$jarray保持返回null ......我不知道爲什麼會這樣。我已經驗證了我的JSON在這個問題: validated json question誰能告訴我我做錯了什麼?或發生了什麼。提前致謝。

當我贊同我的$海峽,我得到如下:image of echo of $str

+0

你試過了,沒有'html_entity_decode'步驟,只是'json_decode($ str,true)'? – rickdenhaan

+3

在'json_decode'方法後面打印'json_last_error()'方法 –

+0

oke我試過沒有html_entity_decode,它仍然返回null。當我打印json_last_error我得到4 – FutureCake

回答

1

要傳遞到json_decode字符串無效JSON,這是返回NULL的原因。

當我從評論檢查錯誤代碼,請產生給4對應於恆JSON_ERROR_SYNTAX只是意味着JSON字符串有語法錯誤

(見http://php.net/manual/en/function.json-last-error.php


您應檢查(回聲)您

$str = file_get_contents('http://localhost/data.json'); 

得到什麼(你可以編輯你的答案,並張貼 - 或它的一部分)

確定它無效JSON;問題在於:data.json

然後當你修復的東西,並從data.json得到什麼預計我會確保你真的需要使用html_entity_decode上獲取的數據。

這將是「奇怪的」有HTML編碼的JSON數據。


UPDATE

看着你從data.json得到什麼它似乎JSON數據實際上包含HTML實體(如我看到的&nbsp; S中存在)

這實際上是怪異的正確的做法是修復如何生成data.json確保非html編碼返回JSON數據,字符集是UTF-8,響應內容類型是Content-Type: application/json

我們不能在這裏加深這一點,因爲我不知道data.json來自哪裏或產生它的代碼。最終你可能會發布另一個答案。

所以這裏是一個快速修復只要正確的方法是我剛纔建議的。

在解碼html實體時,非中斷空格&nbsp;變爲2字節的UTF-8字符(字節值196,160),對於JSON編碼的數據,其爲無效

這個想法是刪除這些字符;你的代碼變成:

$str = file_get_contents('http://localhost/data.json'); 
$decodedstr = html_entity_decode($str); 

// the character sequence for decoded HTML &nbsp; 
$nbsp = html_entity_decode("&nbsp;"); 

// remove every occurrence of the character sequence 
$decodedstr = str_replace($nbsp, "", $decodedstr); 

$jarray = json_decode($decodedstr, true); 
+0

請參閱我編輯的答案 – FutureCake

+0

@FutureCake更新了答案。 – Paolo

+0

你是真正的MVP它的工作感謝人!現在我明白我在做什麼錯了,再次感謝:) – FutureCake

0

從PHP手冊

http://php.net/manual/en/function.json-decode.php

返回

... NULL is returned if the json cannot be decoded or if the encoded data is deeper than the recursion limit

所以,一定傳給json_decode()的JSON字符串無效:

也許因爲html_entity_decode

+0

所以如果我的json超過了遞歸限制我該如何解決這個問題?我得到的數據來自客戶端。所以我可能不能要求他改變json。 – FutureCake

+0

@FutureCake錯誤不是由過多的遞歸引起的,而是由語法錯誤引起的(請參閱我的回答詳情) – Paolo