网站JSON数据存TXT后转数组失败,json_decode返回空的解决方法
解决json_decode返回空的问题
别着急,咱们一步步排查和解决这个问题:
第一步:先拿到具体的解析错误信息
PHP的json_decode失败时不会主动抛出错误,但可以通过两个函数获取到底哪里出了问题,这是最关键的第一步。先写一段测试代码:
// 读取txt文件内容 $jsonContent = file_get_contents('你的文件名称.txt'); // 尝试解析为数组(第二个参数传true返回数组,否则是对象) $targetArray = json_decode($jsonContent, true); // 检查解析状态 if (json_last_error() !== JSON_ERROR_NONE) { echo "解析出错:" . json_last_error_msg(); }
运行这段代码,就能明确知道是格式错误、编码问题还是其他原因导致的解析失败。
第二步:针对常见问题的解决办法
1. JSON格式不合法
这是最常见的原因,比如:
- 字符串用了单引号(JSON规范要求必须用双引号)
- 数组/对象最后一个元素后面多了逗号
- 存在未转义的特殊字符(比如换行、双引号)
解决办法:
- 把txt里的内容复制到JSON校验工具(随便搜一个在线的就行)里检查,修复格式问题;
- 检查你用来保存数据的代码,确保没有额外修改原始JSON内容——比如如果是直接用
file_put_contents保存从网站获取的响应,那基本没问题,但如果中间做了字符串替换、拼接操作,很可能破坏了格式。
2. 文件带有UTF-8 BOM头
有些编辑器保存UTF-8文件时会自动加上BOM头(三个不可见的特殊字符),这会让JSON开头多出无效内容,导致解析失败。
解决办法:
- 用Notepad++打开txt文件,点击「编码」→「转为UTF-8无BOM编码」,再保存;
- 或者在PHP读取时手动去掉BOM头:
$jsonContent = file_get_contents('你的文件名称.txt'); // 移除UTF-8 BOM头 $jsonContent = preg_replace('/^\x{EF}\x{BB}\x{BF}/u', '', $jsonContent); $targetArray = json_decode($jsonContent, true);
3. 文件编码与JSON要求不符
JSON规范要求用UTF-8编码,如果你的txt文件是GBK等其他编码,也会解析失败。
解决办法:
- 在PHP里转换编码后再解析:
$jsonContent = file_get_contents('你的文件名称.txt'); // 从GBK转成UTF-8,根据实际编码调整第二个参数 $jsonContent = mb_convert_encoding($jsonContent, 'UTF-8', 'GBK'); $targetArray = json_decode($jsonContent, true);
4. JSON内容过大导致内存不足
如果你的JSON文件特别大,默认的PHP内存限制可能不够支撑解析。
解决办法:
- 临时调整PHP内存限制:
ini_set('memory_limit', '256M'); // 按需调整大小,比如512M $jsonContent = file_get_contents('你的文件名称.txt'); $targetArray = json_decode($jsonContent, true);
最后验证
修复后再用第一步的测试代码检查,只要json_last_error()返回JSON_ERROR_NONE,那$targetArray就是你想要的数组了。
内容的提问来源于stack exchange,提问作者H.Marcus
相关产品推荐
相关产品推荐

