json_decode 函数的基本格式如下:
$data = json_decode($jsonString, true);
第一个参数是 JSON 字符串。
第二个参数为 true 时,结果会被解析成关联数组;如果省略或为 false,则返回对象。
假设我们有如下的多维 JSON 数据:
{
"user": {
"name": "Alice",
"contacts": [
{"type": "email", "value": "[email protected]"},
{"type": "phone", "value": "123456789"}
]
}
}
解析代码:
$json = '{"user":{"name":"Alice","contacts":[{"type":"email","value":"[email protected]"},{"type":"phone","value":"123456789"}]}}';
$data = json_decode($json, true);
此时,$data 是一个多维关联数组。许多开发者遇到的问题是:
未正确判断 JSON 是否解析成功
如果传入的 JSON 格式有误,json_decode 会返回 null,而且不会报错。需要用 json_last_error() 来判断。
混淆对象与数组访问方式
当 json_decode 第二个参数为 false(默认),返回的是对象,需要用 -> 访问属性;若为 true,返回数组,需要用 [] 访问。
未考虑多维数组的层级访问
对多维数组访问时,写成 $data['user']->name 会导致错误,因为 $data['user'] 是数组而不是对象。
$data = json_decode($json, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 解析错误:" . json_last_error_msg();
exit;
}
这一步能有效避免后续处理错误。
// 错误示范(第二个参数为true,结果为数组,不能用 ->)
echo $data['user']->name; // 会报错
// 正确示范
echo $data['user']['name']; // 输出 Alice
假设我们想遍历 contacts:
foreach ($data['user']['contacts'] as $contact) {
echo $contact['type'] . ": " . $contact['value'] . "\n";
}
对于结构复杂且层数不固定的 JSON,可能需要递归解析。示例:
function printJson($data, $indent = 0) {
if (is_array($data)) {
foreach ($data as $key => $value) {
echo str_repeat(" ", $indent) . $key . ": ";
if (is_array($value)) {
echo "\n";
printJson($value, $indent + 1);
} else {
echo $value . "\n";
}
}
}
}
printJson($data);
这段代码可以清晰打印多维数组的所有层级和键值。
使用 json_decode 解析多维 JSON 时,务必检查解析是否成功,使用 json_last_error()。
明确传入的第二参数,决定返回对象还是数组,访问方式要一致。
对多维数组或对象,准确访问层级,避免混用 -> 和 []。
需要时使用递归函数处理复杂多维结构。
只要掌握以上要点,就能有效避免 json_decode 解析多维 JSON 数据时的常见陷阱,写出更健壮、可维护的 PHP 代码。