json_decode() 返回 null 主因是 JSON 格式非法或编码错误,需用 trim() 预处理、检查 UTF-8 编码、调用 json_last_error_msg() 定位问题,并注意第二个参数 true 才返回数组。

json_decode() 返回 null 怎么办
PHP 里把 JSON 字符串转成数组,核心就是 json_decode()。但它返回 null 不代表你写错了函数,大概率是 JSON 格式本身不合法,或者编码不对。
常见错误现象:json_last_error() 返回 JSON_ERROR_SYNTAX、JSON_ERROR_UTF8,或者直接静默失败(尤其在中文字段没转义、末尾多逗号、用单引号代替双引号时)。
使用场景:接收前端 POST 的 JSON 数据、读取 JSON 文件、解析第三方 API 返回体。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先用
trim()去掉首尾空白,再传给json_decode() - 检查是否 UTF-8 编码:
mb_detect_encoding($json, ['UTF-8'], true) === 'UTF-8' - 强制补全错误提示:
var_dump(json_last_error_msg());
- 避免直接对 $_POST 或 $_GET 调用
json_decode()—— 它们通常是表单编码,不是原始 JSON 字符串
要关联数组还是对象?第二个参数别漏
json_decode() 默认返回 stdClass 对象,不是数组。想得到 PHP 关联数组,必须显式传 true 作为第二个参数。
参数差异:
-
json_decode($json)→ 对象(访问用->key) -
json_decode($json, true)→ 关联数组(访问用['key'])
容易踩的坑:
- 忘记加
true,后续用is_array()判断失败,或 foreach 报错 - 混合嵌套结构下,误以为顶层是数组,其实子级仍是对象(比如
"data": {"list": [...]},$arr['data']是数组,但$arr['data']->list会出错)
性能影响:加 true 不影响解析速度,只是内部数据结构映射方式不同。
JSON 中有数字字符串,怎么避免被自动转成 int/float
PHP 解析 JSON 时,默认会把纯数字字符串(如 "123"、"0.5")转成整型或浮点型。这在处理订单号、手机号、带前导零的编号(如 "00123")时会丢精度。
使用场景:支付单号、身份证号、设备序列号、IPv4 地址段。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- PHP 8.2+ 可用
JSON_INVALID_UTF8_IGNORE+JSON_OBJECT_AS_ARRAY组合,但不解决数字类型问题 - 更可靠的做法是:先用
json_decode($json, true, 512, JSON_BIGINT_AS_STRING),其中JSON_BIGINT_AS_STRING能把大整数强制转为字符串(防溢出),但对普通数字无效 - 真正通用解法:手动预处理 JSON 字符串,把关键字段名(如
"order_id")对应的值用正则包一层引号(慎用),或改用第三方库如ext-jsond(需额外安装)
兼容性注意:低于 PHP 7.4 的环境不支持 JSON_INVALID_UTF8_IGNORE 等新标志。
从文件读 JSON 再转数组,记得检查 file_get_contents 返回值
直接 json_decode(file_get_contents('config.json')) 很常见,但一旦文件不存在、权限不足、内容为空,file_get_contents() 返回 false,传给 json_decode() 就变成解析 false → 返回 null,且 json_last_error() 是 JSON_ERROR_DEPTH(容易误导)。
常见错误现象:本地测试正常,上线后配置文件路径不对,程序静默失败。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 始终检查
file_get_contents()返回值:if ($json === false) { throw new Exception("Failed to read config.json"); } - 路径用绝对路径或
<strong>DIR</strong> . '/config.json',避免相对路径歧义 - 如果 JSON 文件由用户上传,务必验证 MIME 类型和内容头,不能只靠扩展名
复杂点在于:错误可能发生在 IO 层、编码层、语法层三层,而 json_last_error() 只反映最后一层。得一层层排除。











