如何合并JSON文件中重复顶级键对应的对象?
问题描述
我有如下JSON文件:
{ "parent1": { "child1": "bob" }, "parent1": { "child2": "tom" }, "parent2": { "child1": "jon" } }
我希望合并重复顶级键下的对应值,期望输出如下:
{ "parent1": { "child1": "bob", "child2": "tom" }, "parent2": { "child1": "jon" } }
目前我使用以下代码检测重复键:
import json def check_duplicates(pairs): d = {} for key, val in pairs: if key in d: raise ValueError(f"Duplicate key(s) found: {key}") else: d[key] = val return d filename = "test.json" with open(filename, "r") as f: try: data = json.load(f, object_pairs_hook=check_duplicates) except ValueError as err: print(f"{filename}: Failed to decode: {err}")
请问如何实现合并功能?
解决方案
修改object_pairs_hook对应的函数,将原来抛出错误的逻辑替换为合并重复键子字典的逻辑即可,代码如下:
import json def merge_duplicate_keys(pairs): result = {} for key, val in pairs: if key in result: # 针对示例中重复键对应值均为字典的场景,直接合并子键值对 if isinstance(result[key], dict) and isinstance(val, dict): result[key].update(val) # 若需处理非字典类型的重复值,可在此扩展逻辑 # 例如保留所有值为列表、覆盖旧值等,按需调整 else: # 示例:非字典类型时保留最后出现的值 result[key] = val else: result[key] = val return result filename = "test.json" with open(filename, "r") as f: try: merged_data = json.load(f, object_pairs_hook=merge_duplicate_keys) # 打印或写入合并后的结果 print(json.dumps(merged_data, indent=4)) except Exception as err: print(f"{filename}: 处理失败: {err}")
关键逻辑说明
- 遍历JSON解析生成的键值对序列,逐个处理每个键值:
- 键未存在时,直接存入结果字典;
- 键已存在时,先判断新旧值是否均为字典,若是则用
update合并子项; - 针对非字典类型的重复值,示例默认保留最后出现的值,可根据实际需求修改(比如改为
result[key] = [result[key], val]将值转为列表存储)。
运行上述代码后,即可得到你期望的合并后JSON结构。
内容的提问来源于stack exchange,提问作者sjk05
相关产品推荐
相关产品推荐

