本工具可以嵌套比较2个json结构是否相同,以及值是否相等,记录了详细的对比差异。

# -*- coding: UTF-8 -*-
"""
@file:jsonCompareUtil.py
@time:2022/06/17
"""class JsonCompareUtil:@classmethoddef compareValues(cls, source, target, compare_result:list, *ignores, path='')->list:"""递归对比两个json串的value,返回具体的对比说明:param source: 比较的模板json:param target: 目标json:param ignores: 忽略对比的key:param path: 不用传:param compare_result: 存放对比结果, 必须是list"""if not isinstance(compare_result, list):raise TypeError('JsonCompareUtil.compareValues方法的result参数类型不是list')if not isinstance(source, (list, tuple, dict, set)):# 比对非list、tuple、dict、set类型的数据if not source == target:msg = {'field': path,'error_type': '值不相等','source': source,'target': target}compare_result.append(msg)elif isinstance(source, (list, tuple, set)):#类型是否一致if type(source) != type(target):msg = {'field': path,'error_type': "类型不一致",'source': f"类型={type(source)}",'target': f"类型={type(target)}"}compare_result.append(msg)return#长度是否一致if len(source) != len(target):msg = {'field': path,'error_type': "数组长度不一致",'source': f"数组长度={len(source)}",'target': f"数组长度={len(target)}"}compare_result.append(msg)return#值是否一致for index, value in enumerate(source):if index < len(target):cls.compareValues(value, target[index], compare_result, *ignores, path = f'{path}[{index}]' if path else f'{index}')else:cls.compareValues(value, {}, compare_result, *ignores, path = f'{path}[{index}]' if path else f'{index}')else:#比对值为dict类型数据if not isinstance(target, dict):msg = {'field': path,'error_type': "目标非dict",'source': f"源类型={type(source)}",'target': f"目标类型={type(target)}"}compare_result.append(msg)returnsource_keys = source.keys()target_keys = target.keys()#求差集diff_keys = list(source_keys ^ target_keys)#有key不同if diff_keys:for key in diff_keys:msg = {'field': f"{path}.{key}" if path else f'{key}','error_type': '字段缺失','source': source.get(key, None),'target': target.get(key, None)}compare_result.append(msg)#key都相同,递归处理else:for key, value in source.items():if key in ignores:continueif key in target.keys():cls.compareValues(value, target[key], compare_result, *ignores, path = f"{path}.{key}" if path else f'{key}')else:msg = {'field': f"{path}.{key}" if path else f'{key}','error_type': '字段缺失','source': value,'target': f"字段[{key}]缺失"}compare_result.append(msg)@classmethoddef compareKeys(cls, source, target, compare_result:list, path=''):"""递归对比两个json的结构,返回具体的对比说明:param source: 比较的模板json:param target: 目标json:param path: 不用传:param compare_result: 存放对比结果, 必须是list"""if not isinstance(compare_result, list):raise TypeError('JsonCompareUtil.compareValues方法的result参数类型不是list')#数组if isinstance(source, list) and isinstance(target, list):#递归处理里面的dictfor a, b in zip(source, target):cls.compareKeys(a, b, compare_result, path=path)if isinstance(source, dict) and isinstance(target, dict):source_keys = source.keys()target_keys = target.keys()#求差集diff_keys = list(source_keys ^ target_keys)#有key不同if diff_keys:for key in diff_keys:msg = {'field': f"{path}.{key}" if path else f'{key}','error_type': '字段缺失','source': source.get(key, None),'target': target.get(key, None)}compare_result.append(msg)#key都相同,递归处理else:for key, value in source.items():#字典嵌套if isinstance(value, dict):cls.compareKeys(value, target.get(key), compare_result, path=f'{path}.{key}' if path else key)#列表中包含字典elif isinstance(value, list):cls.compareKeys(value, target.get(key), compare_result, path=f'{key}[*]')if __name__ == '__main__':source1 = {"returnStatus": "SUCCEED","serverTime": "1655429850722","requestId": "6fe938f38bec47ac89ef92fed90ef306","data": {"switch": {"key1":1},"params": {"retryDelay": 60}}}target1 = {"returnStatus": "SUCCEED","serverTime": "1655429850722","requestId": "6fe938f38bec47ac89ef92fed90ef306","data": {"params": {"retryDelay": 80}}}result = []JsonCompareUtil.compareValues(source1, target1, result)print(result)source2 = {"returnStatus": "SUCCEED","serverTime": "1655429850722","requestId": "6fe938f38bec47ac89ef92fed90ef306","data": {"params": {"retryDelay": 60}}}target2 = {"returnStatus": "SUCCEED","serverTime": "1655429850722","requestId": "6fe938f38bec47ac89ef92fed90ef306","data": {"params": {"retryDelay": 60,"maxStoredSize": 200,"daySizeMax": 50000,"retryTime": 3,"packageSize": 80}}}result = []JsonCompareUtil.compareValues(source2, target2, result)print(result)

json结构、值对比python源码实现相关推荐

  1. Python源码解读之零 Python源码整体架构

    今天打算开一个新的系列,本系列将和大家一起对Python的源码进行分析,有参考陈儒的<Python 源码剖析>(强烈推荐这本书),做到知其然知其所以然. 总体架构 首先我们先从总体结构看一 ...

  2. Python源码学习:多线程实现机制

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文分析Python中的多线程机制,主要通过一个多线程的脚本来分析多线程的基本操作与 ...

  3. python 取余_玩转Python源码(一) quot;%squot;与“%d”

    某一天吹水的时候,吹着吹着就吹到了一下这么一个案例. import timeitdef a():"%s, %s" % (1, 2)def b():"%s, %d" ...

  4. Python源码学习笔记:Python程序执行过程与字节码

    Python程序执行过程与字节码 注:本篇是根据教程学习记录的笔记,部分内容与教程是相同的,因为转载需要填链接,但是没有,所以填的原创,如果侵权会直接删除. 问题: 我们每天都要编写一些Python程 ...

  5. Python源码学习:Python类机制分析

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 本文主要分析Python中类时如何实现的,在Python中,一切都是对象:任何对象都 ...

  6. Python源码学习:Python函数浅析-有参函数

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 继续上一篇无参函数的调用后,本文将分析Python中的有参函数的大致流程,在Pyth ...

  7. Python源码学习:内建类型简析并简析int对象

    Python源码分析 本文环境python2.5系列 参考书籍<<Python源码剖析>> 上一篇文章中已经大致分析了下,Python的启动执行流程,现在我们分析一下Pytho ...

  8. 详解 Python 源码之对象机制

    在Python中,对象就是在堆上申请的结构体,对象不能是被静态初始化的,并且也不能是在栈空间上生存的.唯一的例外就是类型对象(type object),Python中所有的类型对象都是被静态初始化的. ...

  9. Python源码剖析[16] —— Pyc文件解析

    Python源码剖析[16] -- Pyc文件解析 2008-02-28 18:29:55|  分类: Python |举报 |字号 订阅 Python源码剖析 --Pyc文件解析 本文作者: Rob ...

最新文章

  1. Spring MVC中DispatcherServlet理解总结(1)
  2. 常见医疗扫描图像处理步骤
  3. 4分钟极速甩脂训练!抛开借口!繁忙族必备!
  4. Hashtable源码注释
  5. grub shell 错误_使用grub-install修复Grub时出错
  6. mysql爆内存_线上MySQL数据库机器内存爆掉原因分析与解决
  7. IOS-UITextField类
  8. 正则表达式实现身份证信息验证
  9. Unity3d查找游戏对象
  10. OPPO副总裁曝光Reno十倍变焦规格 能用上的安卓机皇不超过两个
  11. 退休后,你是因为什么还要继续工作?做原来的工作还是做新工作?
  12. 基于jQuery鼠标悬停上下滑动导航条
  13. jpa删除数据后数据库无修改_jpa删除数据库
  14. vue-cli3 vue.config.js配置
  15. Haskell分解质因数
  16. Effective Modern C++42招独家技巧助你改善C++11和C++14的高效用法笔记
  17. php工程师等级划分,PCB工程师的这四个等级,你都修炼到了什么级别?
  18. 【Python_010】利用python对excel进行去重
  19. 用户需求变更和确认的注意事项
  20. utf8一个汉字最多需要多少个byte

热门文章

  1. GD32F103配置SPI+DMA收发数据
  2. 键盘组合键映射_如何在键盘上重新映射Office键
  3. 安装 Unity 个人免费版
  4. STM32单片机可变频率幅度DDS信号发生器正弦波三角波方波AD9833
  5. 【总结】56个JavaScript 实用工具函数助你提升开发效率!
  6. oracle 列转行sql函数
  7. vscode使用ssh远程连接失败(及其他问题合集)
  8. 数字电路 电平转换总结
  9. 设置elementui表格的上下左右滚动条
  10. 大数据运营过程中存在哪些问题?