json_decode()默认返回stdClass对象而非数组,需传true参数才得关联数组;解析失败静默返回null,须用json_last_error()检查;输入必须为UTF-8无BOM。

json_decode() 是 PHP 里把 JSON 字符串转成数组的唯一可靠方式,但默认返回对象,不是数组——这点不注意,后续用 $arr['key'] 会直接报错。
为什么 json_decode($json) 返回的是对象而不是数组?
PHP 的 json_decode() 默认行为是把 JSON 解析成 stdClass 对象。这是历史设计,不是 bug。如果你直接写 $data = json_decode($json); echo $data['name'];,会触发 “Cannot use object of type stdClass as array” 错误。
要让它返回关联数组,必须显式传入第二个参数 true:
$arr = json_decode($json, true);
这个 true 表示“assoc”,即强制返回关联数组(array),而非对象。
- 不加
true→ 返回stdClass对象,只能用->访问,如$obj->name - 加
true→ 返回array,可用['key']或['nested']['id']访问 - 如果 JSON 顶层是数组(如
[{"id":1}]),加true后得到的是索引数组,内部对象也会变成关联数组
json_decode() 失败时返回什么?怎么判断?
失败时不抛异常,而是静默返回 null。常见失败原因包括:JSON 格式错误、编码不是 UTF-8、含 BOM、嵌套过深、超内存限制。
务必在解码后检查返回值是否为 null,再用 json_last_error() 定位问题:
$arr = json_decode($json, true);
if ($arr === null && json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException('Invalid JSON: ' . json_last_error_msg());
}
-
json_last_error()必须紧跟在json_decode()后调用,中间不能夹其他 JSON 操作 -
json_last_error_msg()在 PHP 5.5+ 才有,老环境得自己映射错误码 - UTF-8 以外的编码(如 GBK)必须先用
mb_convert_encoding($json, 'UTF-8', 'GBK')转换,否则大概率返回null
遇到中文乱码或空数组怎么办?
典型现象:JSON 字符串本身含中文,但 json_decode($json, true) 返回空数组或 null。根本原因几乎都是编码问题或不可见控制字符。
- 用
trim($json)去首尾空白,再用preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/', '', $json)清除非法控制字符 - 确认字符串是合法 UTF-8:
mb_check_encoding($json, 'UTF-8')返回false就得转码 - 不要用
iconv('GBK', 'UTF-8//IGNORE', $json),//IGNORE可能吞掉有效字节;推荐mb_convert_encoding($json, 'UTF-8', 'auto') - 如果源数据来自
file_get_contents(),检查文件本身是否带 BOM;可用hexdec(bin2hex(substr($json, 0, 3))) === 0xEFBBBF判断并截掉
最常被忽略的一点:PHP 的 json_decode() 不支持 JSON5(比如注释、单引号、末尾逗号),哪怕只多一个逗号,也会整个返回 null。调试时别只盯着逻辑,先用在线 JSON 验证器过一遍原始字符串。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











