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()很难定位隐式问题。
解决方法
- 修正属性访问路径,目标数组的正确访问路径为:
var_dump($dataTwo->appeal->appeal->askAmounts);
- 规范化Guzzle响应体的读取逻辑,先把流转成完整字符串再做JSON解码,避免流指针偏移导致的内容截断问题:
$res->getBody()->rewind(); // 强制将流指针重置到起始位置 $jsonString = $res->getBody()->getContents(); $dataTwo = json_decode($jsonString);
- 增加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
相关产品推荐
相关产品推荐

