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

Python中生成数组内动态嵌套JSON对象时出现双层列表问题的排查与解决

问题排查与解决方法

让我帮你分析下代码里的问题,以及对应的修复方案:

核心问题1:字典引用重复导致数据覆盖

你在for item in items循环的外面创建了data = OrderedDict(),这意味着每次遍历商品时,你修改的都是同一个字典对象。当你把data添加到main列表时,添加的是这个字典的引用,而不是副本。最终main里的所有元素都会变成最后一个商品的数据,这显然不是你想要的结果。

核心问题2:双重JSON序列化导致转义异常

你先通过json.dumps(main)把列表转换成JSON字符串,接着又用json.dump(result, file)把这个字符串写入文件。这相当于把字符串作为单个JSON值来存储,系统会自动转义字符串里的引号,最终就会出现"[{...}]"这种带转义标记的结果,甚至被意外包裹在列表中。

另外还有个小细节:如果想收集所有页面的商品数据,你应该把main列表的初始化放在URL循环的外面,否则每次处理新URL时,之前的数据都会被清空。


修复后的完整代码

import requests
import json
from collections import OrderedDict

def geturl():
    urls = [ # 这里填入你的URL列表 ]
    baseurl = # 这里填入你的基础详情页URL
    main = []  # 把main移到URL循环外,收集所有页面的商品数据
    
    with open('temp.json', 'w', encoding='utf-8') as file:
        for url in urls:
            r = requests.get(url)
            print(r.status_code)
            response_data = json.loads(r.content)
            items = response_data['items']
            
            for item in items:
                # 每次循环都创建新的OrderedDict,确保每个商品是独立对象
                item_info = OrderedDict()
                item_info['Title'] = item['name']
                item_info["Price"] = item['price']
                item_info['Detail Page'] = baseurl + item['slug']  # 修正了键名的拼写错误(Detai → Detail)
                item_info['Image'] = item['thumb_image']
                main.append(item_info)
        
        # 直接将列表序列化为JSON写入文件,避免双重序列化
        json.dump(main, file, indent=4, ensure_ascii=False)

geturl()

关键修改说明

  • 独立字典对象:在商品循环内部创建新的item_info字典,每个商品对应独立的对象,彻底解决数据覆盖问题。
  • 避免双重序列化:去掉json.dumps(main)步骤,直接用json.dump(main, file)将列表写入文件,生成标准的JSON数组,不会出现多余的转义引号。
  • 全局收集数据:把main的初始化移到URL循环外,确保所有页面的商品数据都会被收集到同一个列表中。
  • 细节优化:修正了键名的拼写错误,添加ensure_ascii=False保证非ASCII字符(比如中文)正常显示,不会被转义为Unicode编码。

这样修改后,你的temp.json会生成一个干净的JSON数组,每个元素都是独立的商品对象,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Muhammad Fahim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 13:44:10