PHP json_decode()报错 json_last_error()判断错误类型

   2023-08-15 14:55:16

other

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

相关评论:
admin test
admin test

靡不有初|  当前时间:  |  网站运行时间:  |鲜克有终

今年剩余【农历】:

粤ICP备19080315号