json_decode的結果為null,json_encode的結果為
首先,樓主在寫介面的時候,是用laravel查詢資料庫,然後對返回的結果進行:json_decode(json_encode($ret),true)
,,本以為能順利的轉化為json字串輸出的,結果卻發現結果為null,因此記錄一下。
一、json_decode($str,true)的結果為null
1、原因:
(1)$str只能UTF-8編碼
(2)元素最後不能有逗號(與php的array不同)
(3)元素不能使用單引號
(4)元素值中間不能有空格和n,必須替換
2、解決方案:
$data = stripslashes(html_entity_decode($info ));
//$info是傳遞過來的json字串
$data = json_decode($data,TRUE);
//這時候$data就是解析後的陣列了!
//html_entity_decode() 函式的作用是把 HTML 實體轉換為字元。
//stripslashes() 函式的作用是刪除反斜槓。
二、js_encode的結果為false
1、是的,在我排除json_decode為null的問題之後,我發現我的json_encode的結果竟然為false,很無奈,百度了一下,人家說主要原因就是字元格式的問題。php的json_encode($str)裡面的str只能是UTF-8格式的。
2、解決方案:
function array_iconv($in_charset,$out_charset,$arr){
return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';'));
}
網上找的程式碼是這個,但需要因大家的實際業務來寫,比如我的$arr是個陣列物件,而且用eval之後一直報錯,所以我就直接改了下:
$ret =iconv('GBK','UTF-8//IGNORE',var_export($arr,true));
return MyResponse::success(json_decode(json_encode($ret ),true),200);
這樣就OK了,成功的輸出了json字串
三、遇到的問題:
1、PHP的iconv()函式遇到的錯誤: Detected an illegal character in input string …
原因:你要轉換的陣列中含有iconv()函式不認識的字元,可能是繁體字,也可能是反斜槓等。
解決方案:
(1) 擴大輸出字元編碼的範圍,如把GBK2312改為GBK.
(2) 在輸出的字元編碼字串後面加上”//IGNORE”,如iconv(‘GBK’,’UTF-8//IGNORE’,var_export($arr,true)),這樣做其實是忽略了不能轉換的字元,避免了出錯但卻不能夠正確地輸出(即空白不、輸出)。
2、 eval()’d code line 3:
解決方案:
(1)檢視你的程式碼,要知道eval()裡面輸出的必須是符合php規範的,也就是逗號,分號,一個都不能少
(2)注意有沒有漏掉反斜槓,如:
eval("if ($strif) {\$ifFlag=true;}else{\$ifFlag=false;}");
eval("if (\$strif) {\$ifFlag=true;}else{\$ifFlag=false;}");
上面的因為少個反斜槓,所以報錯了。。
end