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

Python合并两个JSON文件时data字段内容被覆盖的解决方法

问题根源

Python字典原生的update()方法只会做顶层键的覆盖替换,不会递归合并嵌套字典的内容。你的两个源文件都存在顶层键data,直接执行data1.update(data2)时,会直接将data1中整个data字段的值替换为data2的data值,原data1里存储的admin配置自然就被覆盖丢失了。

解决方案

适配当前场景的最简实现

你当前的需求不需要处理复杂的多层嵌套冲突,只需要单独对data字段做合并即可,不需要直接合并两个顶层字典:

import json

# 读取两个源文件
with open("test1.json", "r", encoding="utf-8") as f:
    data1 = json.load(f)
with open("test2.json", "r", encoding="utf-8") as f:
    data2 = json.load(f)

# 仅合并data字段下的键值对,保留test1的顶层version字段
data1["data"].update(data2["data"])

# 写出合并结果
with open("out.json", "w", encoding="utf-8") as f:
    # indent=2用于格式化输出JSON,ensure_ascii=False避免中文被转义
    json.dump(data1, f, indent=2, ensure_ascii=False)

运行后输出的文件会保留test1的version字段,data下会同时存在admin1、admin2、admin3、user1、user2、user3所有配置项,不会出现数据丢失。

适配多层嵌套的通用递归合并方案

如果后续你的JSON结构存在更多层嵌套字典,需要递归合并而不是直接覆盖同名字段,可以使用自定义的深合并函数:

import json

def deep_merge(base: dict, add: dict) -> dict:
    for key, val in add.items():
        # 如果两边同一个键对应的值都是字典,递归向下合并
        if key in base and isinstance(base[key], dict) and isinstance(val, dict):
            deep_merge(base[key], val)
        # 其他类型直接覆盖/追加
        else:
            base[key] = val
    return base

with open("test1.json", "r", encoding="utf-8") as f:
    data1 = json.load(f)
with open("test2.json", "r", encoding="utf-8") as f:
    data2 = json.load(f)

merged_data = deep_merge(data1, data2)

with open("out.json", "w", encoding="utf-8") as f:
    json.dump(merged_data, f, indent=2, ensure_ascii=False)

这个方案在你当前的场景下和最简实现效果一致,后续就算JSON新增嵌套配置也能正常处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:54:20