
本文详解 PHP 中解析多层嵌套 JSON 时常见的数组访问错误,重点说明当 data 字段为对象数组时,必须使用数组下标(如 [0])而非对象属性语法(如 ->value)来访问元素。
本文详解 php 中解析多层嵌套 json 时常见的数组访问错误,重点说明当 `data` 字段为对象数组时,必须使用数组下标(如 `[0]`)而非对象属性语法(如 `->value`)来访问元素。
在调用 API 并使用 json_decode() 解析返回的 JSON 数据后,开发者常误将数组结构当作单个对象处理。从你提供的 print_r 输出可见:
[response] => stdClass Object
(
[total] => 56
[frequency] => annual
[data] => Array // ← 注意:这是一个 PHP 数组,不是对象!
(
[0] => stdClass Object
([period] => 2021, [value] => 0)
[1] => stdClass Object
([period] => 2021, [value] => 0)
)
)
关键问题在于:$response->response->data 是一个 索引数组(Array),其每个元素才是 stdClass 对象。因此以下写法是错误的:
// ❌ 错误:试图把数组当对象访问 $response->response->data->value; // 返回 NULL,导致空白页
正确做法是先通过下标访问数组中的某一项,再读取其属性:
// ✅ 正确:先取数组元素,再访问对象属性 $firstItem = $response->response->data[0]; echo $firstItem->period; // 输出:2021 echo $firstItem->value; // 输出:0 // 或链式写法(PHP 7.0+) echo $response->response->data[0]->period;
若需遍历全部数据,应使用 foreach 遍历 $response->response->data:
if (isset($response->response->data) && is_array($response->response->data)) {
foreach ($response->response->data as $item) {
echo "Period: {$item->period}, Value: {$item->value}\n";
// 示例输出:Period: 2021, Value: 0
}
}
⚠️ 注意事项:
- 始终检查 data 是否存在且为数组:isset($response->response->data) && is_array($response->response->data)
- 若希望统一使用关联数组而非对象,可在 json_decode() 中传入 true 参数:json_decode($jsonData, true),此时 $response['response']['data'][0]['period'] 即可访问;
- 循环逻辑中存在潜在 bug:你的 do...while 条件 while($response->response->total == 1) 与实际分页逻辑不符(total=56 表示总数,非是否还有下一页),建议改用 offset + length 分页控制,并判断 count($response->response->data) === $length 是否需继续请求。
掌握 JSON 结构与 PHP 数据类型的对应关系([] → array,{} → stdClass),是安全、健壮解析 API 响应的基础。










