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

json_decode()返回空值,PHP遍历JSON数据时foreach循环报错求助

解决JSON解析失败&foreach循环报错的问题

嘿,我一眼就看出问题出在哪了——你的JSON数据格式不合法!你现在的JSON是两个独立的对象直接硬拼在一起,既没放在数组里,对象之间也没加逗号分隔,这就导致json_decode()根本没法正确解析,直接返回null了,后面的foreach自然就报错啦。

第一步:先搞懂为什么解析失败

你原来的JSON是这样的:

{"_id":{"$oid":"59043fcee557e6ad53662ed5"},"url":"http://farm3.staticflickr.com/2893/34203321321_f9a2ff200b_b.jpg","asc":0,"id":1} {"_id":{"$oid":"59043fcee557e6ad53662ed6"},"url":"http://farm3.staticflickr.com/2840/34175955132_ab92628fb3_b.jpg","asc":1,"id":1}

这属于无效JSON,因为JSON语法规定:如果要存储多个对象,必须把它们放在数组([])中,并且对象之间用逗号分隔。

第二步:两种修复方案

方案1:直接修改JSON文件(推荐)

把JSON改成标准的数组格式:

[
  {"_id":{"$oid":"59043fcee557e6ad53662ed5"},"url":"http://farm3.staticflickr.com/2893/34203321321_f9a2ff200b_b.jpg","asc":0,"id":1},
  {"_id":{"$oid":"59043fcee557e6ad53662ed6"},"url":"http://farm3.staticflickr.com/2840/34175955132_ab92628fb3_b.jpg","asc":1,"id":1}
]

修改后,你原来的代码就能正常工作了,再配合错误排查会更稳妥:

$file = "jsonfile.json";
$jsondata = file_get_contents($file);
$data = json_decode($jsondata, true);

// 加上这句,能快速定位解析错误
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON解析出错啦:" . json_last_error_msg();
    exit;
}

// 现在可以放心foreach了
foreach ($data as $item) {
    echo "图片URL:" . $item['url'] . "<br>";
    echo "排序值ASC:" . $item['asc'] . "<br><hr>";
}

方案2:如果没法修改原始JSON文件(比如数据是外部接口返回的)

可以手动修复JSON字符串,再解析:

$file = "jsonfile.json";
$jsondata = file_get_contents($file);

// 手动把无效JSON改成数组格式
$fixedJson = '[' . str_replace('}{', '},{', $jsondata) . ']';
$data = json_decode($fixedJson, true);

// 同样加错误检查
if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON解析出错啦:" . json_last_error_msg();
    exit;
}

// 循环处理数据
foreach ($data as $item) {
    print_r($item);
    echo "<br><hr>";
}

这个方法的核心是把两个对象之间的}{替换成},{,再给整个字符串加上数组的首尾括号[],把它变成合法的JSON数组。

小提示:以后遇到JSON解析失败,先查错误原因

json_last_error()和json_last_error_msg()是PHP里排查JSON解析问题的神器,能直接告诉你是语法错误、编码问题还是其他原因,比瞎猜高效多啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:33:46