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

