
本文详解 PHP 中使用 json_decode() 解析 JSON 字符串的常见错误与正确实践,重点解决因 JSON 格式不合法(如缺失方括号、花括号)导致的解析失败问题,并提供可运行的示例代码与调试建议。
本文详解 php 中使用 `json_decode()` 解析 json 字符串的常见错误与正确实践,重点解决因 json 格式不合法(如缺失方括号、花括号)导致的解析失败问题,并提供可运行的示例代码与调试建议。
在 PHP 中从 JSON 字符串提取数据,核心步骤是:验证 JSON 格式合法性 → 使用 json_decode() 转为 PHP 对象或数组 → 按结构路径访问目标字段。但初学者常因 JSON 语法错误(如遗漏中括号 [] 或大括号 {})导致 json_decode() 返回 null,进而引发“Trying to get property of non-object”等致命错误。
以原始代码为例,其 JSON 字符串存在严重语法缺陷:
"toppings": [{"data":
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
}]此处 "data": 后紧跟的是多个独立对象字面量,但未用 [ ] 包裹——这违反了 JSON 规范(数组必须以 [ 开头、] 结尾)。正确写法应将 data 的值定义为一个JSON 数组:
"toppings": [
{
"data": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
]修正后的完整可运行代码如下:
立即学习“PHP免费学习笔记(深入)”;
<?php
$json = '{
"type": "donut",
"name": "Cake",
"toppings": [
{
"data": [
{ "id": "5002", "type": "Glazed" },
{ "id": "5006", "type": "Chocolate with Sprinkles" },
{ "id": "5004", "type": "Maple" }
]
}
]
}';
$yummy = json_decode($json);
if ($yummy === null) {
die('JSON 解析失败: ' . json_last_error_msg());
}
// 提取第三个 topping 的 data 数组中第 3 个元素的 id(索引从 0 开始)
echo $yummy->toppings[0]->data[2]->id; // 输出: 5004
?>✅ 关键注意事项:
- 始终检查
json_decode()返回值是否为null,并用json_last_error_msg()定位具体错误; - 使用在线 JSON 验证工具(如 JSONFormatter)快速检测格式问题;
- 若需更灵活的数据访问(如动态键名或容错处理),建议使用关联数组模式:
json_decode($json, true),再通过isset()安全访问; - 注意 JSON 中的数组(
[])与对象({})在 PHP 中分别对应索引数组与stdClass对象,不可混用->和[]访问方式。
掌握 JSON 结构与 PHP 数据类型的映射关系,是稳健提取数据的前提。一次规范的 JSON 输入,胜过十次错误调试。



















