You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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图片,极端情况会触发该限制)
修复方案
  1. 先添加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);
  1. 针对对应错误做处理:
  • 若提示语法错误:先清理响应内容的非法字符再解码
// 移除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);
  1. 解码成功后做类型校验再访问数据,避免报错:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 10:42:23