如何比较结构相似的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
相关产品推荐
相关产品推荐

