json_decode第二个参数为true时返回关联数组,否则返回stdclass对象;前者用$arr['key']访问,后者用$obj->key,嵌套结构中数组语法更安全易用。

json_decode 第二个参数 true 决定返回数组还是对象
它不是“让解析更彻底”或“开启高级模式”,而是明确告诉 json_decode():遇到 JSON 对象(即 {})时,别生成 stdClass 实例,直接转成 PHP 关联数组。不传或传 false,默认返回对象。
不加 true 时访问数据要写 ->,加了就用 []
这是最直接影响开发体验的差异:
- 没加
true:$obj = json_decode($json); echo $obj->name; - 加了
true:$arr = json_decode($json, true); echo $arr['name'];
嵌套越深,对象写法越容易出错(比如 $obj->data->items[0]->id),而数组写法支持 ??、isset() 和 array_key_exists() 更自然,也兼容 foreach ($arr as $k => $v)。
JSON 数组 [] 总是变成索引数组,跟第二个参数无关
这点常被误解:
-
[1,2,3]→ 总是[0 => 1, 1 => 2, 2 => 3] -
{"a":1,"b":2}→ 加true才是['a' => 1, 'b' => 2];不加就是stdClass对象 - 混合结构如
{"list":[1,2],"meta":{"ok":true}}:只有外层对象和meta的类型受true影响,list始终是索引数组
容易踩的坑:传字符串 "true" 或数字 1
json_decode($json, "true") 或 json_decode($json, 1) 虽然在弱类型上下文中可能“碰巧”生效,但属于隐式转换,不可靠:
-
"true"是字符串,PHP 会把它转成布尔true,但可读性差、易被误读 -
1在某些严格校验场景(如静态分析工具、PHPStan)会报类型警告 - 显式写
true才符合函数签名预期,也避免未来 PHP 版本收紧类型检查时出问题
真正要注意的其实是 json_last_error() —— 如果 JSON 格式本身有误,无论第二个参数怎么设,结果都是 null,且不会报错。必须主动检查错误码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











