PHP json_decode()报错 json_last_error()判断错误类型 解决
背景:最近在用curl请求接口获取json数据串的时候,一直出现PHP中json_decode()解析字符串失败,于是网上各种查找资料,最终尝试了多种方式,总算解决。下面将可能会遇到的情况和解决方案总结于下:
注意:
低版本php json错误码不全
json_last_error()错误msg对照表:
0 = JSON_ERROR_NONE //没有错误发生
1 = JSON_ERROR_DEPTH //到达了最大堆栈深度
2 = JSON_ERROR_STATE_MISMATCH //无效或异常的json
3 = JSON_ERROR_CTRL_CHAR //控制字符错误,可能是编码不对
4 = JSON_ERROR_SYNTAX //语法错误
5 = JSON_ERROR_UTF8 //异常的utf-8字符,也许是因为不正确的编码
json_last_error()函数测详细介绍请参见:
PHP中文手册
json_decode要求的字符串比较严格
使用UTF-8编码
不能在最后元素有逗号
不能使用单引号
不能有\r,\t,如果有请替换
一、bom头问题
json字符串中的BOM头是不可见字符,某些编辑器默认会加上BOM头。
$info = json_decode(trim($info,chr(239).chr(187).chr(191)),true);
二、语法错误
echo json_last_error()//=4
出现这个问题是因为在 json 字符串中反斜杠被转义,只需要用 htmlspecialchars_decode() 函数处理一下 $content 即可:
$info= htmlspecialchars_decode($info);
echo json_last_error()//=3
$info= preg_replace('/[\x00-\x1F\x80-\x9F]/u', '', trim($info));
如何处理json中的非法utf8字符
//reject overly long 2 byte sequences, as well as characters above U+10000 and replace with ?
$some_string = preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]'.
'|[\x00-\x7F][\x80-\xBF]+'.
'|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*'.
'|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})'.
'|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/S',
'?', $some_string );
//reject overly long 3 byte sequences and UTF-16 surrogates and replace with ?
$some_string = preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]'.
'|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $some_string );