
本文讲解如何使用 php 的 json_decode() 解析嵌套 json,并正确访问多层结构中的深层字段(如 factordetails 数组内的 price),避免因忽略数组索引或对象层级导致的“无法获取值”问题。
本文讲解如何使用 php 的 json_decode() 解析嵌套 json,并正确访问多层结构中的深层字段(如 factordetails 数组内的 price),避免因忽略数组索引或对象层级导致的“无法获取值”问题。
在处理 API 返回的 JSON 响应时,常见误区是假设所有字段都直接位于根对象下。但实际数据往往具有嵌套结构——正如您提供的示例所示:
{
"CustomerCode": 101,
"FactorNumber": 53,
"FactorDate": 14010201,
"FactorDetails": [
{
"ProductCode": 21901,
"Count": 15,
"Price": 96000000,
"VisitorID": 0
}
]
}此处 FactorDetails 是一个数组(即使只含一个元素),而 Price 位于该数组第一个对象(索引 0)内部。因此,不能直接写 $product->Price 或 $product->FactorDetails->Price,而必须显式指定数组下标:
$response = json_decode($response->getBody());
foreach ($response as $product) {
echo "日期: " . $product->FactorDate . "\n";
echo "价格: " . $product->FactorDetails[0]->Price . "\n";
}✅ 关键要点:
- json_decode() 默认返回 stdClass 对象,支持链式 -> 访问;
- 若 FactorDetails 可能为空或含多个条目,务必先校验,否则会触发 PHP Notice(如 Trying to access array offset on value of type null):
if (!empty($product->FactorDetails) && isset($product->FactorDetails[0]->Price)) {
echo "价格: " . $product->FactorDetails[0]->Price . "\n";
}- 如需遍历全部明细(例如一张单据含多个商品),应嵌套循环:
foreach ($response as $product) {
echo "单据日期: " . $product->FactorDate . "\n";
foreach ($product->FactorDetails as $detail) {
echo " 商品编码: {$detail->ProductCode}, 单价: {$detail->Price}\n";
}
}? 调试建议:
使用 JSON Beautifier 在线工具格式化原始 JSON,直观查看层级与数据类型;本地开发中可配合 var_dump($product) 或 print_r($product) 快速确认结构。
总结:访问嵌套 JSON 的核心在于「逐层确认数据类型」——对象用 ->,数组用 [index],并始终对可能为空的中间节点做防御性检查。
立即学习“PHP免费学习笔记(深入)”;



















