json_decode返回null主因是输入非法而非函数故障,需检查编码、BOM、语法、不可见字符及输入类型,并用json_last_error()精准定位错误。

PHP 解析 JSON 失败,八成是 json_decode 返回了 null,而不是数据——不是 JSON 写错了,就是编码或类型没对上。
为什么 json_decode 总返回 null
这不是函数坏了,而是它遇到非法输入时严格拒绝妥协。常见原因有:
-
json_last_error()不为 0,但你没查——比如中文乱码(UTF-8 BOM、GBK 编码)、尾部逗号、单引号代替双引号 - 传入的是空字符串、
null或布尔值,不是 JSON 字符串 - JSON 字符串里混了不可见字符(比如从剪贴板粘贴时带的零宽空格)
- 用了
json_decode($str, true)却误以为对象也能用->访问
json_decode 第二个参数 true 和 false 怎么选
这个布尔值决定返回数组还是对象,影响后续所有取值方式,选错会导致 Notice: Trying to get property 'xxx' of non-object 这类报错。
- 填
false(默认)→ 返回stdClass对象:$data->name - 填
true→ 返回关联数组:$data['name'] - 如果 JSON 顶层是数组(如
[{"id":1}]),无论是否设true,都按对应结构解析;但嵌套里的对象/数组行为仍受此参数控制 - 不确定数据结构时,优先用
true,避免对象属性访问失败又难调试
解析前必须做的三件事
别急着 json_decode,先让输入“干净”:
立即学习“PHP免费学习笔记(深入)”;
- 用
trim($json)去首尾空白,尤其防换行和 BOM - 检查编码:
mb_detect_encoding($json, ['UTF-8', 'GB2312'], true) === 'UTF-8',否则用mb_convert_encoding($json, 'UTF-8', 'auto') - 验证合法性:
json_decode($json, true) !== null || json_last_error() === JSON_ERROR_NONE,不能只看返回值是否为null,因为false或0也可能被误判
大 JSON 或嵌套深时要注意什么
PHP 默认限制解析深度和内存,线上环境容易出 JSON_ERROR_DEPTH 或超时:
- 深度不够?加第三个参数:
json_decode($json, true, 512)(PHP 7.3+ 支持,旧版最大 128) - 超大字符串?确认
memory_limit足够,且post_max_size/upload_max_filesize不卡在中间环节 - 别用
json_decode(file_get_contents('huge.json'))直读大文件——会一次性载入内存;改用流式解析库(如jsonstream)或分块处理
最常被跳过的其实是编码校验和 json_last_error() 检查——很多人只写 if (!$data),却不知道 false、0、空数组都可能触发,而真正的错误藏在 json_last_error_msg() 里。











