PHP json_decode()报错 json_last_error()判断错误类型及解决方法


Scan me! 分类:PHP 作者:myerob 标签:PHP json_decode() 报错 json_last_error() 判断错误类型 解决方法 阅读:703 收藏
导读:
PHP json_decode()报错 json_last_error()判断错误类型 解决背景:最近在用curl请求接口获取json数据串的时候,一直出现PHP中json_decode()解析字符串…

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 );

 

 

 

 


相关推荐