Python实现json串比对并输出差异结果

该博客介绍了一种利用递归算法对比两个JSON字符串的方法,主要用于幂等接口返回体的验证。通过逐层级、逐字段比较,可以找出两份JSON数据的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要是利用递归,逐层级、逐次、逐字段比较;可以用于幂等类接口的返回体校验。

class JsonCompare:
	def __init__(self, second_data, first_data, debug_model=False):
		"""
		用于两个json串比对,输出两串json字段差异

		:param second_data: 用于比对的新json
		:param first_data: 基准json
		:param debug_model: 为True时将在控制台输出比对结果,默认不开启
		"""

		self.compare_result = []  # 存放字段差异
		self.compare_error = []  # 存放字段比对异常
		self.compare(second_data, first_data)

		if debug_model:
			for i in self.compare_result:
				print(i)
			for i in self.compare_error:
				print(i)

	def compare(self, second_data, first_data, path=''):
		try:
			if not isinstance(second_data, (list, tuple, dict)):
				# 比对非list\tuple\dict类型的数据
				if not second_data == first_data:
					msg = {
   
   
						'field': path,
						'error_type': 'field value diff',
						'secondResp': second_data,
						'firstResp': first_data
					}
					self.compare_result.append(msg)

			elif isinstance(second_data, (list, tuple)):
				# 如果新数据是list/tuple,则判断老数据是否类型一致;不一致则追加到compare_error
				if type(second_data) != type(first_data):
					msg = {
   
   
						'field': path,
						'error_type': "field type diff",
						'secondResp': f"type is {
     
     type(second_data)}",
						'firstResp': f"type is {
     
     type(first_data)}"
					}
					self.compare_result.append(msg)
					return
				if 
### Python JSON 文件或对象比较工具 对于PythonJSON文件或对象的比较,存在多种方法和工具可以实现这一目标。以下是几种常用的方法: #### 使用内置函数 `json` 和 `dict.items()` 通过加载两个JSON字符到字典逐项对比键值对来完成基本的比较操作。 ```python import json def compare_json(json_str1, json_str2): dict1 = json.loads(json_str1) dict2 = json.loads(json_str2) diff_keys = set(dict1.keys()).symmetric_difference(set(dict2.keys())) if not diff_keys and all(dict1[k] == dict2[k] for k in dict1.keys()): return "No differences found." else: diffs = [] for key in diff_keys.union(dict1.keys()): val1 = dict1.get(key, 'Key Not Present') val2 = dict2.get(key, 'Key Not Present') if val1 != val2: diffs.append(f"{key}: {val1} vs {val2}") return "\n".join(diffs) ``` 这种方法适用于简单的JSON结构[^1]。 #### 利用第三方库 `deepdiff` 当面对复杂的嵌套数据结构时,推荐使用专门设计用来深入比较复杂数据类型的库——DeepDiff。它能够检测列表中的顺序变化以及更深层次的对象属性差异。 安装 DeepDiff: ```bash pip install deepdiff ``` 应用实例: ```python from deepdiff import DeepDiff t1 = {'a': 1, 'b': [2, 3], 'c': {'d': 4}} t2 = {'a': 1, 'b': [3, 2], 'c': {'e': 5}} ddiff = DeepDiff(t1, t2) print(ddiff) ``` 这段代码会输出详细的变更报告,包括新增加、删除或是修改过的项目及其具位置。 #### GUI 工具 Json Diff Viewer 如果偏好图形界面的应用程序,则可以选择像Json Diff Viewer这样的在线服务或者是桌面应用程序来进行直观地查看两份JSON文档之间的区别。不过这类解决方案通常更适合偶尔的需求而非集成到自动化流程当中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值