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
相关产品推荐
相关产品推荐

