使用PHP json_decode解析JSON文件遇问题:仅获取嵌套数组最后一个对象
嘿,我碰到过好多次这种重复键导致的JSON解析坑了,咱们一步步把它解决掉~
问题根源
首先得明确:JSON规范里是不允许重复键名的,当你用json_decode()解析时,PHP会按照规范自动覆盖前面的重复键值,所以最后就只剩BANNER2了——这不是PHP的bug,是符合标准的行为。
最优解决方案:重构JSON结构
最靠谱的方式是修改你的JSON文件,把重复的单个对象改成一个数组集合。假设你原来的JSON大概是这样的:
{ "BANNER": { "id": 1, "image": "banner1.jpg" }, "BANNER": { "id": 2, "image": "banner2.jpg" } }
把它改成数组形式,用一个统一的键(比如banners)来包裹所有banner对象:
{ "banners": [ { "id": 1, "image": "banner1.jpg" }, { "id": 2, "image": "banner2.jpg" } ] }
这样用PHP解析时就能拿到所有banner了:
// 读取JSON文件 $jsonContent = file_get_contents('your-banner-file.json'); // 解析为关联数组(第二个参数true转为数组,默认是对象) $bannerData = json_decode($jsonContent, true); // 遍历所有banner foreach ($bannerData['banners'] as $banner) { echo "Banner ID: {$banner['id']}, 图片地址: {$banner['image']}<br>"; }
临时方案:无法修改JSON源文件时
如果因为某些原因(比如是第三方提供的JSON,没法改),可以用PHP正则先处理重复键,给它们加上唯一后缀再解析:
$jsonContent = file_get_contents('your-banner-file.json'); $count = 0; // 把重复的"BANNER"键替换成"BANNER_1", "BANNER_2"... $modifiedJson = preg_replace_callback( '/"BANNER"(?=:)/', function($matches) use (&$count) { return '"BANNER_' . ++$count . '"'; }, $jsonContent ); // 解析修改后的JSON $bannerData = json_decode($modifiedJson, true); // 现在可以访问所有banner了 print_r($bannerData['BANNER_1']); print_r($bannerData['BANNER_2']);
不过这个方案是权宜之计,正则可能会误匹配其他内容,优先还是推荐重构JSON结构哦。
内容的提问来源于stack exchange,提问作者Daniel Kay
相关产品推荐
相关产品推荐

