
本文详解如何在 PHP 中正确解析形如 [{"key":"value"}] 的 JSON 字符串,并通过索引访问数组内首个对象的属性,避免因忽略外层数组结构导致的 Notice: Trying to access array offset on value of type null 等错误。
本文详解如何在 php 中正确解析形如 `[{"key":"value"}]` 的 json 字符串,并通过索引访问数组内首个对象的属性,避免因忽略外层数组结构导致的 `notice: trying to access array offset on value of type null` 等错误。
在 PHP 开发中,常会遇到以方括号 [] 开头的 JSON 字符串——它表示一个JSON 数组,即使其中只包含单个对象(如 [{"title":"..."}])。若直接对 json_decode() 的返回值使用 $json['title'] 或 $json->title,将无法获取数据,因为解码后得到的是一个索引数组(array),而非关联数组或标准对象。
✅ 正确解析步骤
- 调用 json_decode():将 JSON 字符串转为 PHP 变量(默认为 stdClass 对象数组);
- 访问首元素:使用 $json[0] 获取数组中的第一个对象;
- 读取属性:通过对象箭头语法(->title)或转换为关联数组后使用下标(['title'])。
以下为完整可运行示例:
<?php
$txt = '[{"title":" \ud83c\uddfa\ud83c\udde6 \u041b\u0443\u0447\u0448\u0435\u0435 \u043a\u0430\u0437\u0438\u043d\u043e \u0423\u043a\u0440\u0430\u0438\u043d\u044b \ud83c\uddfa\ud83c\udde6 ","desc":"50 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u0437\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044e!","price":"0.0055"}]';
// Step 1: 解码为对象数组(默认行为)
$json = json_decode($txt);
// Step 2 & 3: 安全访问第一个对象的 title 属性
if (is_array($json) && !empty($json) && isset($json[0]->title)) {
echo htmlspecialchars($json[0]->title, ENT_QUOTES, 'UTF-8');
} else {
echo '无效的 JSON 数据或缺失 title 字段';
}
?>? 提示:json_decode($txt, true) 可返回关联数组(而非对象),此时应写作 $json[0]['title']。
⚠️ 关键注意事项
- 始终校验解码结果:json_decode() 在失败时返回 null,需用 json_last_error() 检查错误;
- 检查数组长度与键存在性:避免 Undefined offset 或 Trying to get property 'xxx' of non-object 错误;
- 处理 Unicode 与 XSS 风险:输出到 HTML 前建议使用 htmlspecialchars() 转义;
-
生产环境推荐显式类型判断:
if (json_last_error() !== JSON_ERROR_NONE) { throw new InvalidArgumentException('JSON 解析失败: ' . json_last_error_msg()); }
✅ 总结
JSON 字符串开头的 [ 并非“干扰符号”,而是明确语义:它代表一个数组容器。开发者必须尊重这一层级结构——先解包数组,再操作内部对象。掌握 json_decode() 返回值的类型特征、配合空值/类型校验及安全输出,是稳健处理各类 JSON 接口响应的基础能力。
立即学习“PHP免费学习笔记(深入)”;



















