错误描述
在 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
- $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