
本文介绍如何使用 PHP 的 json_decode() 函数解析结构化 JSON 数据,并通过多层数组键路径快速定位并提取目标字段(如 CPU 型号字符串)。
本文介绍如何使用 php 的 `json_decode()` 函数解析结构化 json 数据,并通过多层数组键路径快速定位并提取目标字段(如 cpu 型号字符串)。
该字符串实际是合法的 JSON 格式(尽管包含 "@attributes" 等特殊键名,但完全符合 JSON 语法),因此最可靠、最高效的方式是将其解析为 PHP 关联数组,而非使用正则表达式或字符串截取——后者易受格式变动影响,且难以维护。
首先确保原始字符串 $CPU 是完整、有效的 JSON。注意:示例中开头为 [ {...} ],即顶层为一个包含单个对象的数组,因此索引应从 0 开始。
✅ 正确提取步骤如下:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 使用
json_decode($CPU, true)将 JSON 字符串转为关联数组(第二个参数true至关重要,否则返回对象,需用对象属性语法访问); - 按层级结构逐级访问键:
$arr[0]["entries"]["entry"][0]; - 其中:
-
[0]对应顶层数组第一个元素; -
["entries"]对应处理器信息对象(注意其"@attributes"中"name": "processor"可作为语义校验依据); -
["entry"]是一个索引数组,而 CPU 型号字符串位于该数组的第 0 位(即"Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz")。
-
<?php
$CPU = '[{
"@attributes": {
"name": "processors"
},
"entry": ["2", "1", "successful"],
"entries": {
"@attributes": {
"name": "processor"
},
"entry": ["Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz", "GenuineIntel", "2500000000", "3100000000", "2", "4", "true", "9", "100 MHz", "7"],
"entries": {
"@attributes": {
"name": "caches"
},
"entries": [{
"@attributes": {
"name": "cache"
},
"entry": ["Level 1 Cache", "131072"]
}, {
"@attributes": {
"name": "cache"
},
"entry": ["Level 2 Cache", "524288"]
}, {
"@attributes": {
"name": "cache"
},
"entry": ["Level 3 Cache", "3145728"]
}]
}
}
}]';
// 解析 JSON 为关联数组
$arr = json_decode($CPU, true);
// 安全提取:先判断解析是否成功,再检查关键键是否存在
if (json_last_error() === JSON_ERROR_NONE &&
isset($arr[0]['entries']['entry'][0])) {
$cpuModel = $arr[0]['entries']['entry'][0];
echo "CPU 型号: " . htmlspecialchars($cpuModel); // 输出:Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz
} else {
throw new RuntimeException('JSON 解析失败或目标字段不存在');
}
?>⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 必须校验
json_decode()返回值是否为null(常见于 JSON 格式错误、编码不一致如 UTF-8 BOM);建议配合json_last_error()进行调试; - 若数据来源不可控(如外部 API),建议增加
isset()或array_key_exists()防御性检查,避免未定义索引警告; - 特殊键名如
"@attributes"在 PHP 中可直接作为字符串键访问,无需转义; - 如需提取其他字段(如主频
"2500000000"→ 2.5 GHz),可复用相同路径,仅调整末尾索引(如[2])。
总结:面对结构清晰的 JSON 数据,优先选择原生解析而非文本处理——它更健壮、可读性强、易于扩展,且天然支持任意嵌套层级的精确访问。


















