JSON文件含重复键,Python加载后仅显单个值,如何解决?
问题:JSON重复键加载后丢失的原因与解决办法
你有如下格式的JSON文件:
[{"groupid": -1001742069667, "5214840393": "0x8B9e9893663f1845304073f0250b8d706145ceF1", "5214840393": "0x8B9e9893663f1845304073f0250b8d706145ceF1", "5214840393": "0x8B9e9893663f1845304073f0250b8d706145ceF1" }, {"groupid": -1001742069669}, {"groupid": -1001742069669}, {"groupid": -1001742069669}, {"groupid": -1001742069669}]
使用以下Python代码加载并打印第一个字典对象:
import json file=open("addresses.json",'r') new = json.load(file) print(new[0])
执行结果仅显示:
{'groupid': -1001742069667, '5214840393': '0x8B9e9893663f1845304073f0250b8d706145ceF1'}
但期望打印出该字典中的所有条目,以下是原因分析与解决办法:
原因
- JSON规范明确要求对象的键必须唯一,Python标准库的
json模块在解析时,会用后续出现的同名键值对覆盖前面的,最终仅保留最后一个同名键对应的内容。 - 你提供的JSON中第一个对象包含3个相同的
"5214840393"键,解析后自然只剩下最后一个的取值。
解决办法
方法1:修改JSON结构(推荐)
将相同键对应的多个值改为数组形式,既符合JSON规范,也能正常解析所有内容:
[ { "groupid": -1001742069667, "5214840393": [ "0x8B9e9893663f1845304073f0250b8d706145ceF1", "0x8B9e9893663f1845304073f0250b8d706145ceF1", "0x8B9e9893663f1845304073f0250b8d706145ceF1" ] }, {"groupid": -1001742069669}, {"groupid": -1001742069669}, {"groupid": -1001742069669}, {"groupid": -1001742069669} ]
使用原代码加载后,就能看到数组形式的所有值。
方法2:自定义JSON解析器
如果无法修改JSON源文件,可通过json.JSONDecoder的object_pairs_hook参数自定义解析逻辑,将重复键的值收集到数组中:
import json def handle_duplicate_keys(pairs): result = {} for key, value in pairs: if key in result: # 若键已存在,转换为数组存储 if not isinstance(result[key], list): result[key] = [result[key]] result[key].append(value) else: result[key] = value return result with open("addresses.json", 'r') as file: new = json.load(file, object_pairs_hook=handle_duplicate_keys) print(new[0])
执行后输出:
{'groupid': -1001742069667, '5214840393': ['0x8B9e9893663f1845304073f0250b8d706145ceF1', '0x8B9e9893663f1845304073f0250b8d706145ceF1', '0x8B9e9893663f1845304073f0250b8d706145ceF1']}
内容的提问来源于stack exchange,提问作者malaka namaka
相关产品推荐
相关产品推荐

