
本文详解 php 中解析嵌套 json 时常见的属性访问错误,重点解决因对象层级理解偏差和字符串插值语法不当导致的字段无法输出问题,并提供可直接运行的修复示例。
本文详解 php 中解析嵌套 json 时常见的属性访问错误,重点解决因对象层级理解偏差和字符串插值语法不当导致的字段无法输出问题,并提供可直接运行的修复示例。
当你使用 json_decode() 解析 JSON 数据时,PHP 默认返回一个 stdClass 对象树(而非关联数组),其结构严格对应原始 JSON 的嵌套关系。观察你提供的 JSON 片段:
[
{
"Ticket": {
"TicketNo": 1920,
"Creation": "21.03.2016 05:45:00",
"FailureDescription": "Error 46"
},
"Measures": [
{
"StartTime": "2017-03-17T05:45:00",
"Description": "Long description"
}
]
}
]该数据是一个顶层数组,每个元素是一个包含两个属性的对象:Ticket(对象)和 Measures(数组)。因此,正确的访问路径是:
- ✅ $myItem->Ticket->TicketNo(先取 Ticket 对象,再取其 TicketNo 属性)
- ❌ $myItem->TicketNo(错误:TicketNo 并非 $myItem 的直接属性)
此外,在双引号字符串中直接写 $myItem->Ticket->TicketNo 会导致 PHP 解析失败——它仅识别 $myItem->Ticket 为变量,后续 ->TicketNo 被当作普通文本处理。必须使用花括号语法 {} 显式界定变量边界:
$file = file_get_contents($remote_url, false, $context);
$myData = json_decode($file); // 返回对象数组
foreach ($myData as $myItem) {
// 正确:用 {$...} 包裹完整对象路径
echo "<tr>
<td>{$myItem->Ticket->TicketNo}</td>
<td>CLOSED</td>
<td>{$myItem->Ticket->Creation}</td>
<td>{$myItem->Ticket->FailureDescription}</td>
</tr>";
echo "<tr><th>Start</th><th>Measure</th></tr>";
foreach ($myItem->Measures as $wm) {
echo "<tr><td>{$wm->StartTime}</td><td>{$wm->Description}</td></tr>";
}
}⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 若改用 json_decode($file, true) 获取关联数组,则需改用方括号语法:$myItem['Ticket']['TicketNo'],且同样需用 {$myItem['Ticket']['TicketNo']} 在双引号中插值;
- 建议添加空值校验,避免 Notice: Trying to get property 'xxx' of non-object 错误:
if (isset($myItem->Ticket) && is_object($myItem->Ticket)) { echo "<td>{$myItem->Ticket->TicketNo}</td>"; }- 使用 var_dump($myData) 时注意观察输出结构:顶层是 array[0] => object(stdClass), 内部才是 Ticket => object(stdClass) —— 这是定位层级的关键依据。
掌握 JSON 结构映射与 PHP 字符串插值规则,即可稳健访问任意深度的嵌套数据。



















