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

在使用PHP的json_decode处理接口返回的JSON数据时,可能会遇到解析失败的问题。通过json_last_error()函数可以判断错误类型。常见的错误包括:最大堆栈深度限制、状态不匹配、控制字符错误、语法错误和UTF-8编码问题。解决方法包括检查JSON字符串的编码、处理反斜杠转义、去除BOM头和修正非法UTF-8字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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要求的字符串比较严格

  1. 使用UTF-8编码
  2. 不能在最后元素有逗号
  3. 不能使用单引号
  4. 不能有\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 );

引用:
https://blog.youkuaiyun.com/haibo0668/article/details/82744812
https://www.cnblogs.com/wt645631686/p/8419932.html
https://segmentfault.com/a/1190000006154011

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值