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

PHP Guzzle调用API后json_decode获取子属性返回NULL问题

问题原因

核心原因是对象属性访问路径层级匹配错误,从你贴的var_dump($dataTwo->appeal)输出的缩进结构可以明确看出层级关系:

  • 你打印的$dataTwo->appeal本身是编号3388的stdClass对象,它的直接属性只有appealVersionCode、appeal、description、name、products五个,本身没有askAmounts属性,直接访问不存在的对象属性自然返回NULL。
  • 你要找的长度为5的askAmounts数组,是3388对象下嵌套的appeal属性(编号3390的stdClass对象)的子属性,和outreach属性同级;另外outreach属性内部还有一个空的askAmounts数组,注意不要混淆两个同名属性。

另外你的代码存在两个不规范的隐患,容易诱发解析异常:

  • 直接把Guzzle返回的Stream响应体对象传给json_decode:getBody()返回的是流对象而非字符串,依赖PHP自动类型转换读取内容时,如果流指针之前被其他读取操作偏移过,会读到截断的残缺内容,导致JSON解析结果异常。
  • 解码后没有做JSON错误校验:如果JSON存在语法问题、编码异常、递归深度超限,json_decode不会主动抛出错误,只会返回部分解析结果甚至NULL,不主动检查json_last_error()很难定位隐式问题。
解决方法
  1. 修正属性访问路径,目标数组的正确访问路径为:
var_dump($dataTwo->appeal->appeal->askAmounts);
  1. 规范化Guzzle响应体的读取逻辑,先把流转成完整字符串再做JSON解码,避免流指针偏移导致的内容截断问题:
$res->getBody()->rewind(); // 强制将流指针重置到起始位置
$jsonString = $res->getBody()->getContents();
$dataTwo = json_decode($jsonString);
  1. 增加JSON解码错误校验,出现隐式解析问题时可以快速定位:
if (json_last_error() !== JSON_ERROR_NONE) {
    throw new \Exception('JSON解析失败:' . json_last_error_msg());
}

如果修正路径后还是无法正常访问,可以执行print_r(array_keys(get_object_vars($dataTwo->appeal->appeal)))打印目标对象的所有属性名,排查是否存在BOM头、零宽空格等不可见控制字符导致属性名匹配失败的情况。

内容的提问来源于stack exchange,提问作者daveisthewave

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 20:18:30