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

如何将多个JSON Schema合并为单个文件并合并嵌套子对象?

合并多个JSON Schema对象的实现方案

需求说明

需要从多个JSON Schema文件生成单个合并后的JSON Schema,以顶层的path和name作为唯一标识,合并嵌套的children子对象(保留所有子项,重复子项无需特殊处理,示例中重复的child2保留即可)。

示例对象

第一个列表中的对象

object_in_first_list = {
    "path": "foo",
    "name": "bar",
    "schema": {
        "name": "something",
        "children": {
            "child1": {"name": "child1"},
            "child2": {"name": "child2"}
        }
    }
}

第二个列表中的对象

object_in_second_list = {
    "path": "foo",
    "name": "bar",
    "schema": {
        "name": "something",
        "children": {
            "child2": {"name": "child2"},
            "child3": {"name": "child3"}
        }
    }
}

期望合并结果

merged_object = {
    "path": "foo",
    "name": "bar",
    "schema": {
        "name": "something",
        "children": {
            "child1": {"name": "child1"},
            "child2": {"name": "child2"},
            "child3": {"name": "child3"}
        }
    }
}

完善后的代码实现

基础版(仅合并children字段)

import copy

# 模拟输入的JSON列表
json_list = [
    [object_in_first_list],
    [object_in_second_list]
]

# 用字典存储已存在的对象,键为(path, name)元组,确保唯一标识
keyword_to_obj = {}
updated_list = []

for jsons in json_list:
    for obj in jsons:
        # 生成唯一标识键
        key = (obj["path"], obj["name"])
        if key not in keyword_to_obj:
            # 深拷贝原对象,避免修改原始数据
            merged_obj = copy.deepcopy(obj)
            keyword_to_obj[key] = merged_obj
            updated_list.append(merged_obj)
        else:
            # 合并已存在对象的children字段
            existing_obj = keyword_to_obj[key]
            existing_obj["schema"]["children"].update(obj["schema"]["children"])

# 输出合并后的结果
print(updated_list[0])

通用递归版(支持所有嵌套字段合并)

如果需要合并schema中更多嵌套字段,而非仅children,可以使用递归合并函数:

import copy

def merge_dict(a, b):
    """递归合并两个字典,将b的内容合并到a中,嵌套字典自动递归处理"""
    for key, value in b.items():
        if key in a and isinstance(a[key], dict) and isinstance(value, dict):
            merge_dict(a[key], value)
        else:
            a[key] = value
    return a

# 模拟输入的JSON列表
json_list = [
    [object_in_first_list],
    [object_in_second_list]
]

keyword_to_obj = {}
updated_list = []

for jsons in json_list:
    for obj in jsons:
        key = (obj["path"], obj["name"])
        if key not in keyword_to_obj:
            merged_obj = copy.deepcopy(obj)
            keyword_to_obj[key] = merged_obj
            updated_list.append(merged_obj)
        else:
            existing_obj = keyword_to_obj[key]
            # 递归合并整个schema对象
            merge_dict(existing_obj["schema"], obj["schema"])

print(updated_list[0])

代码说明

  1. 唯一标识优化:使用(path, name)元组作为字典key,比原代码的列表查找效率更高(O(1) vs O(n))。
  2. 深拷贝处理:避免修改原始输入对象,防止后续操作污染数据源。
  3. 合并逻辑:基础版直接用字典update()方法合并children;递归版支持任意层级的嵌套字典合并,扩展性更强。

内容的提问来源于stack exchange,提问作者Lime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:40:59