最近做抓取网页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);
至此 问题解决
(432)