
当使用 json_decode() 解析 API 返回的 JSON 数据时,若直接通过 $obj->appeal->askAmounts 访问却得到 NULL,很可能是因 JSON 结构存在多层嵌套(如 appeal 字段下还嵌套了一个同名 appeal 对象),导致属性路径错误。
当使用 `json_decode()` 解析 api 返回的 json 数据时,若直接通过 `$obj->appeal->askamounts` 访问却得到 `null`,很可能是因 json 结构存在多层嵌套(如 `appeal` 字段下还嵌套了一个同名 `appeal` 对象),导致属性路径错误。
在你的 var_dump($dataTwo->appeal) 输出中,可以清晰看到:
- 外层 stdClass 对象包含一个名为 appeal 的属性;
- 该 appeal 属性本身又是一个 stdClass 对象,且其内部再次包含一个名为 appeal 的子属性(注意缩进层级);
- 而真正的 askAmounts 数组位于第二层 appeal 内部,即 $dataTwo->appeal->appeal->askAmounts。
✅ 正确访问方式如下:
$data = $res->getBody()->getContents(); // 推荐显式调用 getContents()
$dataTwo = json_decode($data);
// ✅ 正确路径:外层 appeal → 内层 appeal → askAmounts
$askAmounts = $dataTwo->appeal->appeal->askAmounts;
// 验证是否存在且非空
if (is_array($askAmounts) && !empty($askAmounts)) {
foreach ($askAmounts as $item) {
echo "Amount: {$item->amount}, Impact: " . ($item->impact ?? 'N/A') . PHP_EOL;
}
} else {
echo "No askAmounts found.\n";
}
⚠️ 注意事项:
- json_decode($json) 默认返回 stdClass 对象,不支持数组语法(如 $obj['appeal'])。如需数组访问,可传入第二个参数 true:json_decode($json, true),此时返回关联数组,访问方式变为 $dataTwo['appeal']['appeal']['askAmounts']。
- 始终检查解码是否成功:json_last_error() === JSON_ERROR_NONE,避免因 JSON 格式错误导致 null 返回。
- 使用 isset() 或 property_exists() 提前判断嵌套属性是否存在,防止 Notice: Trying to get property 'xxx' of non-object 错误:
if (isset($dataTwo->appeal->appeal->askAmounts)) { // 安全访问 }
? 小技巧:调试时可用 print_r(json_encode($dataTwo, JSON_PRETTY_PRINT)) 或在线 JSON 格化工具查看原始结构,比 var_dump() 更直观识别嵌套层级。
总结:JSON 解析后属性访问失败,首要排查实际结构深度与代码路径是否匹配——看似简单的 $obj->a->b,背后可能藏着 $obj->a->a->b 这样的“同名嵌套陷阱”。养成先 var_dump() 再逐层验证的习惯,能快速定位问题根源。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











