PHP json_decode JSON_ERROR_SYNTAX 錯誤詳解
錯誤描述
在PHP開發過程中,處理json字串時, json_decode返回NULL,呼叫last_error返回4(JSON_ERROR_SYNTAX),但是json字串能夠被其它語言如python, javascript或者一些線上的json解析器正確處理。
診斷
這裡一般會有以下幾種情況會造成php json_decode出錯:
json串從檔案中讀取,字元順序標記(BOM)未去除
json中含有不可見字元,json_decode解析出錯
json物件中值為單引號字串
尤其是第三種錯誤比較隱蔽,肉眼觀察往往容易忽略
解決方案
下面針對上面三種情況分別給出解決方案
BOM
以二進位制方式開啟檔案,確認是否有BOM,如果有,在解析之前去掉BOM即可。下面的程式碼以utf-8為例,檢測並刪除BOM。
function removeBOM($data) { if (0 === strpos(bin2hex($data), 'efbbbf')) { return substr($data, 3); } return $data; }
不可見字元
解析前去除不可見字元即可。
for ($i = 0; $i <= 31; ++$i) { $s = str_replace(chr($i), "", $s); }
單引號字串值
先看下面的例子:
PHP 5.5.9輸出
NULL
4
通常只需要把單引號替換成雙引號就可以了,具體處理時需要注意單引號可能在其它地方也出現,是否全域性替換需要根據具體情況具體分析。