PHP curl获取JSON经json_decode后无法访问data数组的问题
问题原因
json_decode未成功将响应内容解析为数组,返回值仍是原始JSON字符串。
PHP中对字符串类型使用非数字键访问时,会自动将键名转换为整数0,等价于取字符串下标为0的第一个字节,也就是JSON串开头的{,这就是echo仅输出{、无法遍历列表的直接原因。
常见导致json_decode失败的场景:
- 接口返回的JSON带UTF-8 BOM头(
\xEF\xBB\xBF),属于JSON语法外的非法字符 - cURL获取的响应首尾带有多余空格、换行、其他调试输出字符,不符合JSON语法规范
- 接口返回的是gzip/deflate压缩内容,未开启cURL自动解压,拿到的是二进制压缩数据
- JSON本身存在语法错误(如多余尾逗号、转义字符异常)
- 返回内容嵌套层级超过PHP默认递归解析深度限制(本次返回内容超700KB,包含大量base64图片,极端情况会触发该限制)
修复方案
- 先添加JSON解析错误检测,定位具体失败原因,在json_decode后追加如下代码:
$data = json_decode($result, true); if (json_last_error() !== JSON_ERROR_NONE) { var_dump(json_last_error_msg()); exit; } var_dump($data);
- 针对对应错误做处理:
- 若提示语法错误:先清理响应内容的非法字符再解码
// 移除UTF-8 BOM头 $result = trim($result, "\xEF\xBB\xBF"); // 移除首尾不可见空白 $result = trim($result); // 重新解码 $data = json_decode($result, true);
- 若响应内容乱码、长度异常:在cURL执行前添加配置,开启自动解压
curl_setopt($ch, CURLOPT_ENCODING, '');
- 若提示递归深度超限:解码时手动调大深度阈值
// 第三个参数为最大递归深度,设置为1024可覆盖绝大多数业务场景 $data = json_decode($result, true, 1024);
- 解码成功后做类型校验再访问数据,避免报错:
if (is_array($data) && isset($data['data']) && is_array($data['data'])) { foreach ($data['data'] as $idx => $base64Img) { // 在这里写你的图片处理逻辑 echo "第{$idx}张图片base64长度:" . strlen($base64Img) . "<br/>"; } }
正常解码成功后,var_dump($data)会输出数组类型,此时即可正常访问data列表、执行遍历操作。
内容的提问来源于stack exchange,提问作者Learning from masters
相关产品推荐
相关产品推荐

