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

使用Python对比两个JSON文件的键并仅返回键值差异

对比两个JSON文件键值差异的Python实现

嘿,我来帮你搞定这个JSON对比的需求!这里有个实用的Python脚本,能递归遍历JSON的嵌套结构,精准找出两个文件里键值存在差异的部分——不管是键缺失,还是同键不同值,都能给你理得明明白白。

完整代码实现

import json

def compare_json(obj1, obj2, path=""):
    differences = {}
    
    # 获取两个JSON对象的所有唯一键
    all_keys = set(obj1.keys()).union(set(obj2.keys()))
    
    for key in all_keys:
        current_path = f"{path}.{key}" if path else key
        
        # 处理第一个JSON有、第二个没有的键
        if key not in obj2:
            differences[current_path] = {
                "type": "missing in second JSON",
                "value": obj1[key]
            }
        # 处理第二个JSON有、第一个没有的键
        elif key not in obj1:
            differences[current_path] = {
                "type": "missing in first JSON",
                "value": obj2[key]
            }
        # 处理双方都有但值不同的情况
        else:
            val1 = obj1[key]
            val2 = obj2[key]
            
            # 如果都是嵌套字典,递归深入对比
            if isinstance(val1, dict) and isinstance(val2, dict):
                nested_diff = compare_json(val1, val2, current_path)
                if nested_diff:
                    differences.update(nested_diff)
            # 非字典类型的值不相等时,记录差异
            elif val1 != val2:
                differences[current_path] = {
                    "first JSON value": val1,
                    "second JSON value": val2
                }
    
    return differences

def main():
    # 替换成你实际的两个JSON文件路径
    json_file1 = "file1.json"
    json_file2 = "file2.json"
    
    try:
        # 读取并解析JSON文件
        with open(json_file1, 'r', encoding='utf-8') as f1:
            data1 = json.load(f1)
        with open(json_file2, 'r', encoding='utf-8') as f2:
            data2 = json.load(f2)
        
        # 执行对比并获取差异结果
        diffs = compare_json(data1, data2)
        
        if diffs:
            print("找到以下键值差异:")
            print(json.dumps(diffs, indent=2, ensure_ascii=False))
        else:
            print("两个JSON文件的键值完全一致!")
    
    except FileNotFoundError as e:
        print(f"出错啦:找不到文件 {e.filename}")
    except json.JSONDecodeError as e:
        print(f"出错啦:JSON解析失败,文件格式有问题 - {e}")

if __name__ == "__main__":
    main()

代码说明

  • 递归对比逻辑:compare_json函数会遍历两个JSON对象的所有键,处理三种差异场景:一方缺失键、同键不同值,遇到嵌套字典时会自动递归深入对比内部结构,完美适配你提供的多层嵌套JSON格式。
  • 异常处理:脚本加入了文件找不到和JSON格式错误的捕获,避免运行时崩溃,还会给出清晰的错误提示。
  • 结果输出:差异结果会以结构化的JSON格式打印,键路径清晰(比如test.bucket.name),方便你快速定位问题。

使用方法

  1. 把你的两个JSON文件分别命名为file1.json和file2.json(或者修改代码里的文件路径),放在脚本同一目录下。
  2. 运行脚本,就能看到所有键值差异啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:13:13