原创, 服务器,

PHP json_decode 返回 NULL 终极解决方案

最近做抓取网页json结果 json_decode 的时候 总是返回 null, 网上

给出几种解决方法

解决方法一:

出现这个问题是因为在 json 字符串中反斜杠被转义,只需要用 htmlspecialchars_decode() 函数处理一下 $content 即可:

$content = htmlspecialchars_decode($content);

此时再使用 json_decode() 函数解析,就没有问题了.

另外一种

解决方法二:


在保存 json 数据时使用 urlencode() 函数:

$content = urlencode(json_encode($content));

解析时使用 urldecode() 函数:

$content = urldecode($content);

即可避免反斜杠转义造成的无法解析。

但是以上2种并没有解决 返回NULL的问题,于是又看了另外一个解决方案

确保原字符串是UTF-8编码的

使用函数 mb_detect_encoding()检测

如果不是 采用

iconv(‘gbk’,’utf-8′, $result_string),用iconv函数改变的编码格式

不巧的是 我的字符串是 UTF-8的

再次查找

json_decode要求的字符串比较严格:
(1)使用UTF-8编码
(2)不能在最后元素有逗号
(3)不能使用单引号
(4)不能有\r,\t,如果有请替换

以上竟然也不能解决, 于是 使用二进制 将字符串转化成二进制,和正常的比较,发现开头多了

111011111011101110111111

而这个东西竟然是 文件的BOM格式

使用下面的格式去除BOM头

$charset[1] = substr($result, 0, 1);
$charset[2] = substr($result, 1, 1);
$charset[3] = substr($result, 2, 1);
if(ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191){
    $result = substr($result, 3);
}

或者

$result = json_decode(trim($result,chr(239).chr(187).chr(191)),true);

至此 问题解决

(430)

Related Post