
本文讲解如何使用 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免费学习笔记(深入)”;

评论(0)