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

如何合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:01:10