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());
根据最常见的失败场景,按优先级尝试以下解决方案:
- 去除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);
- 统一编码为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']));
- 清理首尾隐形字符
部分情况下JSON首尾会携带空格、换行、全角空格等不可见控制字符,先trim再解析:
$contents = trim($contents);
- 调整解析深度
如果你的JSON嵌套层级超过默认的512层,可以手动加大解析深度参数:
// 第三个参数为最大解析深度,可根据实际情况调整 $data = json_decode($contents, true, 1024);
其他问题说明
- 改用
fopen()读取不会有差异,问题根源是读取到的字符串内容不符合json_decode的解析要求,和读取函数无关。 - 后续从API获取JSON时也要注意同样的问题,部分接口会返回带BOM的内容、或者gzip压缩后未解压的内容,对应处理即可。
内容的提问来源于stack exchange,提问作者user7046880
相关产品推荐
相关产品推荐

