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

如何比较结构相似的JSON字符串并生成指定格式的差异JSON?

如何对比两个JSON并输出指定格式的差异结果?

问题描述

需要对比两个结构相似的JSON字符串,输出包含值差异标签的JSON,具体要求如下:

1st JSON

{
    "x": 10.1,
    "y": 20,
    "name": "Anu",
    "dob": "2010-10-10"
}

2nd JSON

{
    "x": 10,
    "y": 20,
    "name": "Ani",
    "dob": "2010-10-11",
    "z": 100
}

期望输出的Result JSON

{
    "x": 0.1,
    "name": "Text change",
    "dob": "1",
    "z": "Only in 2"
}

已尝试用json.loads将JSON转为字典,再通过deepdiff获取差异,但结果不符合上述格式,请问如何实现需求?


解决方案

可以通过自定义遍历逻辑,针对不同类型的值做差异化处理,直接生成符合要求的结果字典,再转为JSON。以下是具体实现:

代码实现

import json
from datetime import datetime

def compare_jsons(json_str1, json_str2):
    # 将JSON字符串解析为Python字典
    dict1 = json.loads(json_str1)
    dict2 = json.loads(json_str2)
    
    result = {}
    # 获取两个字典所有键的集合,确保不遗漏任何键
    all_keys = set(dict1.keys()).union(set(dict2.keys()))
    
    for key in all_keys:
        val1 = dict1.get(key)
        val2 = dict2.get(key)
        
        if val1 is None:
            # 键仅存在于第二个JSON中
            result[key] = "Only in 2"
        elif val2 is None:
            # 键仅存在于第一个JSON中,可根据需求自定义标签
            result[key] = "Only in 1"
        else:
            # 键在两个JSON中都存在,对比值
            if val1 == val2:
                # 值相同,跳过该键
                continue
            # 根据值的类型做差异化处理
            elif isinstance(val1, (int, float)) and isinstance(val2, (int, float)):
                # 数值类型:计算第一个值与第二个值的差值
                result[key] = val1 - val2
            elif isinstance(val1, str) and isinstance(val2, str):
                # 字符串类型:先尝试识别日期格式
                try:
                    date1 = datetime.strptime(val1, "%Y-%m-%d")
                    date2 = datetime.strptime(val2, "%Y-%m-%d")
                    # 计算日期差的绝对值,转为字符串
                    result[key] = str(abs((date2 - date1).days))
                except ValueError:
                    # 非日期字符串,标记为文本变更
                    result[key] = "Text change"
            else:
                # 其他类型(如布尔、列表等),可自定义标签
                result[key] = "Value changed"
    
    # 将结果字典转为格式化的JSON字符串返回
    return json.dumps(result, indent=4)

测试示例

# 示例输入的两个JSON字符串
json1 = '''
{
    "x": 10.1,
    "y": 20,
    "name": "Anu",
    "dob": "2010-10-10"
}
'''

json2 = '''
{
    "x": 10,
    "y": 20,
    "name": "Ani",
    "dob": "2010-10-11",
    "z": 100
}
'''

# 调用函数并打印结果
print(compare_jsons(json1, json2))

执行后输出的结果将与期望的Result JSON完全一致。

说明

deepdiff的默认输出是包含详细变更类型(如新增键、修改值、修改前后内容等)的结构化数据,并不直接符合你需要的自定义标签格式。通过上述自定义遍历逻辑,可以精准控制每个差异场景的输出内容,完全匹配需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 10:55:13