json_decode() 将合法 JSON 字符串转为 PHP 数组或对象,需确保双引号、括号匹配、无前导零等语法正确,用 json_last_error() 检错,推荐设 $assoc = true 返回数组,并用 JSON_BIGINT_AS_STRING 防大整数精度丢失。

`json_decode()` 是 PHP 里把 JSON 字符串转成 PHP 变量最常用的方法,核心就一条:**给它合法的 JSON 字符串,它还你数组或对象**。用不对,返回 `null`,后面取字段直接报错,所以重点不在“怎么写”,而在“怎么写对”。
确认输入是合法 JSON 字符串
这是最容易卡住的地方。JSON 必须严格符合语法:双引号、括号配对、不能有末尾逗号、数字不能带前导零、中文不乱码(必须 UTF-8)。常见错误示例:
-
❌ 错误:
{"name": "张三", "age": 018}——018是非法八进制写法 -
❌ 错误:
{"items": {"id":1},{"id":2}}—— 缺少中括号,这不是数组,是语法错误 -
❌ 错误:
{"name": '李四'}—— 键和字符串值必须用英文双引号,单引号不行 -
✅ 正确:
[{"id":1,"type":"Glazed"},{"id":2,"type":"Maple"}]
不确定是否合法?先用 json_last_error() 检查:
$data = json_decode($json_str);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
echo 'JSON 解析失败:' . json_last_error_msg();
}
控制返回类型:数组还是对象?
第二个参数 $assoc 决定结构形态,不是可有可无的选项:
-
json_decode($json)或json_decode($json, false)→ 返回stdClass对象,用->访问:$obj->name -
json_decode($json, true)→ 返回关联数组,用['key']访问:$arr['name']
推荐初学者统一用 true,数组更直观、支持 isset()、array_key_exists() 等判断,也方便遍历嵌套结构。
处理嵌套和深层数据
JSON 套得深,解码后访问也要按路径来。比如:
$json = '{"user":{"profile":{"name":"王五","tags":["admin","vip"]}}}';
$arr = json_decode($json, true);
要取 "admin",就得这样写:
-
$arr['user']['profile']['tags'][0](数组方式) -
$obj->user->profile->tags[0](对象方式,前提是没传true)
注意:如果某一层不存在(比如 $arr['user']['settings']),直接访问会触发 notice。建议配合 ?? 空合并操作符或 isset() 判断:
$name = $arr['user']['profile']['name'] ?? '匿名';
进阶控制:深度与大整数处理
默认最多解析 512 层嵌套,一般够用;但遇到超长整数(如微信 openid、MongoDB ObjectId),PHP 默认会转成科学计数法或丢失精度。这时加 JSON_BIGINT_AS_STRING 选项:
$data = json_decode($json, true, 512, JSON_BIGINT_AS_STRING);
这样,"12345678901234567890" 就不会变成 1.2345678901235E+19,而是保持为字符串,后续可安全参与数据库写入或签名计算。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











