如何将多个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])
代码说明
- 唯一标识优化:使用
(path, name)元组作为字典key,比原代码的列表查找效率更高(O(1) vs O(n))。 - 深拷贝处理:避免修改原始输入对象,防止后续操作污染数据源。
- 合并逻辑:基础版直接用字典
update()方法合并children;递归版支持任意层级的嵌套字典合并,扩展性更强。
内容的提问来源于stack exchange,提问作者Lime
相关产品推荐
相关产品推荐

