Day: January 12, 2017
PHP json_decode 返回 NULL 终极解决方案
- by chenxue4076
- 8 years ago
最近做抓取网页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)
查看全文