You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP调用json_decode解析合法JSON文件返回NULL问题求助

排查及解决步骤

首先调用json_last_error()和json_last_error_msg()可以直接定位失败原因,先在你的代码里追加两行输出:

$contents = file_get_contents(DATA_PATH.'/'.$type.'.json');  
$data = json_decode($contents, true);
// 追加错误信息输出
var_dump(json_last_error());
var_dump(json_last_error_msg());

根据最常见的失败场景,按优先级尝试以下解决方案:

  1. 去除UTF-8 BOM头
    绝大多数本地JSON文件解析失败都是这个原因:部分编辑器保存UTF-8文件时会默认在文件开头加3字节的BOM标记,在线校验工具会自动忽略该标记,但PHP的json_decode无法识别,直接返回NULL。
    处理代码:
// 先去除BOM头再解析
if (substr($contents, 0, 3) == pack('CCC', 0xef, 0xbb, 0xbf)) {
    $contents = substr($contents, 3);
}
$data = json_decode($contents, true);
  1. 统一编码为UTF-8
    json_decode要求输入内容必须为UTF-8编码,若你的JSON文件是GBK、GB2312等其他编码,就算肉眼看起来内容正常也会解析失败,先转编码再处理:
$contents = mb_convert_encoding($contents, 'UTF-8', mb_detect_encoding($contents, ['UTF-8', 'GBK', 'GB2312', 'BIG5']));
  1. 清理首尾隐形字符
    部分情况下JSON首尾会携带空格、换行、全角空格等不可见控制字符,先trim再解析:
$contents = trim($contents);
  1. 调整解析深度
    如果你的JSON嵌套层级超过默认的512层,可以手动加大解析深度参数:
// 第三个参数为最大解析深度,可根据实际情况调整
$data = json_decode($contents, true, 1024);

其他问题说明

  • 改用fopen()读取不会有差异,问题根源是读取到的字符串内容不符合json_decode的解析要求,和读取函数无关。
  • 后续从API获取JSON时也要注意同样的问题,部分接口会返回带BOM的内容、或者gzip压缩后未解压的内容,对应处理即可。

内容的提问来源于stack exchange,提问作者user7046880

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:39:03