錯(cuò)誤描述
在PHP開發(fā)過程中,處理json字符串時(shí), json_decode返回NULL,調(diào)用last_error返回4(JSON_ERROR_SYNTAX),但是json字符串能夠被其它語(yǔ)言如python, javascript或者一些在線的json解析器正確處理。
診斷
這里一般會(huì)有以下幾種情況會(huì)造成php json_decode出錯(cuò):
json串從文件中讀取,字符順序標(biāo)記(BOM)未去除
json中含有不可見字符,json_decode解析出錯(cuò)
json對(duì)象中值為單引號(hào)字符串
尤其是第三種錯(cuò)誤比較隱蔽,肉眼觀察往往容易忽略
解決方案
下面針對(duì)上面三種情況分別給出解決方案
BOM
以二進(jìn)制方式打開文件,確認(rèn)是否有BOM,如果有,在解析之前去掉BOM即可。下面的代碼以u(píng)tf-8為例,檢測(cè)并刪除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);
}
單引號(hào)字符串值
先看下面的例子:
<?php
????$s = "{\"x\":'abcde'}";
????$j = json_decode($s, true);
????var_dump($j);
????echo json_last_error() . "\n";
PHP 5.5.9輸出
NULL
4
通常只需要把單引號(hào)替換成雙引號(hào)就可以了,具體處理時(shí)需要注意單引號(hào)可能在其它地方也出現(xiàn),是否全局替換需要根據(jù)具體情況具體分析。