如何给嵌套对象列表的每个元素插入字典?JSON解码报错求助
问题分析与分步解决方案
首先,你的需求完全可行,咱们先解决眼前的错误,再实现正确的合并逻辑。
一、先搞定JSONDecodeError的根源
你遇到的解码错误,本质是原JSON数据不符合规范:JSON对象里的键必须是唯一的,但你提供的JSON里有大量重复的key(比如{"key": 1, "key": "value", ...})。解析器遇到重复键时会直接报错,就算不报错,也只会保留最后一个重复键的值,导致数据丢失。
所以第一步必须修正原JSON的格式,把重复的key改成唯一标识,比如改成key1、key2、key_list这类,修正后的示例:
[{"status_code": 200, "data": {"key1": 1, "key2": "value", "key3": "value", "key4": "value", "key_list": [{"k1": "value", "k2": "value"}, {"k1": "value", "k2": "value"}, {"k1": "value", "k2": "value"}, {"k1": "value", "k2": "value"}, {"k1": "value", "k2": "value"}]}, "status_txt": "OK"},{"status_code": 200, "data": {"key1": 1, "key2": "value", "key3": "value", "key4": "value", "key_list": []}, "status_txt": "OK"}]
二、实现正确的合并逻辑
你的原代码逻辑错了:data.append({"key": "a","key": "b"})是把一个字典(同样有重复键,会被解析成{"key": "b"})直接加到数组末尾,而不是把{"key":"a"}和{"key":"b"}分别合并到原数组的两个对象里。
正确的做法是按索引一一对应合并,用zip同时遍历原数组和待添加的字典列表,然后用update方法把待添加的键值对合并到原对象中:
import json # 读取修正后的JSON文件 with open('file.json', 'r') as infile: data = json.load(infile) # 你要添加的字典列表 add_items = [{"key":"a"}, {"key":"b"}] # 遍历两个列表的对应元素,合并键值对 for original_obj, add_dict in zip(data, add_items): original_obj.update(add_dict) # 写入修改后的JSON,indent=4让格式更美观 with open('file.json', 'w') as outfile: json.dump(data, outfile, indent=4)
运行这段代码后,就能得到你想要的结果:每个原数组对象都会新增对应的key字段。
三、处理边界情况(可选)
如果原JSON数组和待添加的字典列表长度不一致,比如原数组有3个对象,但待添加列表只有2个字典,你可以给多余的对象设置默认值:
add_items = [{"key":"a"}, {"key":"b"}] default_add = {"key": "default"} for idx, original_obj in enumerate(data): if idx < len(add_items): original_obj.update(add_items[idx]) else: original_obj.update(default_add)
四、原代码的错误总结
- JSON格式错误:原JSON包含重复键,导致解析失败
- 逻辑错误:使用
append是往数组末尾加元素,而不是合并到每个对象中;没有实现索引对应的合并逻辑
内容的提问来源于stack exchange,提问作者J.Doe
相关产品推荐
相关产品推荐

