如何基于id与new_id字段合并三个JSON文件?
基于id和new_id合并三个JSON文件的解决方案
你可以通过建立id和new_id的双向映射,一次性完成三个文件的合并,以下是具体实现方案:
原始JSON文件内容
File1.json
[ { "amount": 100, "id": 1 } ]
File2.json
[ { "new_id": 0, "id": 1, "date": "01/01/2023" } ]
注:JSON中字符串需用引号包裹,这里修正了原内容的日期格式
File3.json
[ { "new_id": 0, "start_date": "01/01/2024" } ]
注:同样修正日期为字符串类型
目标合并结果
[ { "amount": 100, "new_id": 0, "id": 1, "date": "01/01/2023", "start_date": "01/01/2024" } ]
实现代码
核心思路
- 建立两个映射表:
id_map(通过id关联条目)和new_id_map(通过new_id关联条目) - 按顺序处理三个文件,先绑定带
id的条目,再通过new_id关联后续条目,最终合并所有字段
完整代码
import json # 定义要合并的文件路径列表 file_paths = ['File1.json', 'File2.json', 'File3.json'] # 初始化映射表与合并结果容器 id_map = {} new_id_map = {} merged = {} for path in file_paths: with open(path, 'r', encoding='utf-8') as f: # 加载整个JSON数组(原代码逐行读取会导致JSON解析错误) data = json.load(f) for item in data: # 处理包含id的条目 if 'id' in item: item_id = item['id'] # 若该id未在合并结果中,先初始化 if item_id not in merged: merged[item_id] = item.copy() id_map[item_id] = merged[item_id] # 已存在则合并字段 else: merged[item_id].update(item) # 如果条目同时包含new_id,建立new_id映射 if 'new_id' in item: item_new_id = item['new_id'] new_id_map[item_new_id] = merged[item_id] # 处理仅包含new_id的条目(如File3) elif 'new_id' in item: item_new_id = item['new_id'] # 找到对应的关联条目并合并字段 if item_new_id in new_id_map: new_id_map[item_new_id].update(item) # 无匹配则直接保留条目 else: merged[f"new_id_{item_new_id}"] = item.copy() new_id_map[item_new_id] = merged[f"new_id_{item_new_id}"] # 将合并后的字典转为列表,得到最终结果 final_result = list(merged.values()) print(json.dumps(final_result, indent=2))
代码说明
- 修正读取逻辑:使用
json.load(f)加载整个JSON文件,避免逐行读取导致的数组括号解析错误 - 双映射关联:通过
id和new_id双向绑定跨文件的关联条目,确保匹配准确 - 字段合并:利用字典
update()方法合并字段,后读取的重复字段会覆盖前序字段(若有) - 容错处理:对于无匹配关联字段的条目,直接保留到合并结果中
内容的提问来源于stack exchange,提问作者Random Access Memory
相关产品推荐
相关产品推荐

