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.functionremoveBOM($data){
if(0===strpos(bin2hex($data),'efbbbf')){
returnsubstr($data,3);
}
return$data;
}
不可见字符
解析前去除不可见字符即可.for($i=0;$i<=31;++$i){
$s=str_replace(chr($i),"",$s);
}
单引号字符串值
先看下面的例子:<?PHP
$s="{\"x\":'abcde'}";
$j=json_decode($s,true);
var_dump($j);
echo json_last_error()."\n";
PHP 5.5.9 输出
NULL
4
通常只需要把单引号替换成双引号就可以了, 具体处理时需要注意单引号可能在其它地方也出现, 是否全局替换需要根据具体情况具体分析.
来源: http://www.jianshu.com/p/e924cb9f05b3