问题: 有两个json体,可是,需要验证json之间的内容有什么差异,然后,就想写一个json,尝试
桌面创建一个python文件,和创建的python文件项目目录下创建
json1.txt json2.txt 分别存放两个json体

#! usr/bin/python
# coding:gbk
"""@File : checkJson.py@DataTime : 2022-05-04 08:15@Author : ChairDu@Email : chair7@163.com@Description : 验证json字符串差异
""""""
json校验,生成新文件存放当前文件目录下
需要新建文件
json1.txt
json2.txt
分别存放两个json体
"""import os
import sys
import json
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
txt_path =  sys.path[0]
json1 = open(r"{0}\json1.txt".format(txt_path),encoding='utf-8').read()
json2 = open(r"{0}\json2.txt".format(txt_path),encoding='utf-8').read()finalJson = []
global x
x = 0
def checkJson(json1,json2):jsons = {**json1,**json2}json_ture, json_false,json1_null,json2_null = [],[],[],[]for json_keys in jsons:global xyyyyy = "JOSN体整体比对:{0}".format("")if json1.get(json_keys) == json2.get(json_keys):# content = {json_keys:json1.get(json_keys)}content = json_keysjson_ture.append(content)elif bool(json1.get(json_keys)) == False:# content = {json_keys: json2.get(json_keys)}content = json_keysjson1_null.append(content)elif bool(json2.get(json_keys)) == False:# content = {json_keys: json1.get(json_keys)}content = json_keysjson2_null.append(content)else:if type(json1.get(json_keys)) == type({}):x = json_keyscheckJson2(json1.get(json_keys),json2.get(json_keys))if type(json1.get(json_keys)) == type([]):x = json_keyscheckJsonList(json1.get(json_keys),json2.get(json_keys))content = {json_keys: {"json1":json1.get(json_keys),"json2":json2.get(json_keys)}}content = json_keysjson_false.append(content)_jsons = {}if bool(json_ture) == True:    # 过滤,仅展示有数据的__jsons = {"比对一致字段": json_ture}_jsons.update(__jsons)if bool(json1_null) == True:    # 过滤,仅展示有数据的__jsons = {"json1为空字段":json1_null}_jsons.update(__jsons)if bool(json2_null) == True:    # 过滤,仅展示有数据的__jsons = {"json2为空字段": json2_null}_jsons.update(__jsons)if bool(json_false) == True:    # 过滤,仅展示有数据的__jsons = {"比对不一致字段": json_false}_jsons.update(__jsons)_jsons = {yyyyy:_jsons}finalJson.append(_jsons)def checkJson2(json1,json2):"""验证json内的json体"""jsons = {**json1, **json2}json_false, json1_null, json2_null = [], [], []for json_keys in jsons:global xyyyyy = "JOSN详细比对:{0}".format(format(x))if json1.get(json_keys) == json2.get(json_keys):passelif bool(json1.get(json_keys)) == False:content = {json_keys: json2.get(json_keys)}json1_null.append(content)elif bool(json2.get(json_keys)) == False:content = {json_keys: json1.get(json_keys)}json2_null.append(content)else:if type(json1.get(json_keys)) == type({}):x = json_keyscheckJson2(json1.get(json_keys), json2.get(json_keys))elif type(json1.get(json_keys)) == type([]):x = json_keyscheckJsonList(json1.get(json_keys), json2.get(json_keys))else:content = {json_keys: {"json1": json1.get(json_keys), "json2": json2.get(json_keys)}}json_false.append(content)_jsons = {}if bool(json1_null) == True:    # 过滤,仅展示有数据的__jsons = {"json1为空字段": json1_null}_jsons.update(__jsons)if bool(json2_null) == True:    # 过滤,仅展示有数据的__jsons = {"json2为空内容": json2_null}_jsons.update(__jsons)if bool(json_false) == True:    # 过滤,仅展示有数据的__jsons = {"不一致内容": json_false}_jsons.update(__jsons)if bool(_jsons) == True:_jsons = {yyyyy:_jsons}finalJson.append(_jsons)def checkJsonList(list1,list2):"""验证json内的list"""json_false = []global xyyyyy = "JOSN详细比对:{0}".format(format(x))len_list = len(list1) if len(list1) < len(list2) else len(list2)for i in range(0, len_list):print()if len(list1) != len(list2):content = {"列表长度不一致": "list1:{}\tlist2:{}".format(len(list1),len(list2))}json_false.append(content)elif list1[i] == list2[i]:passelif type(list1[i]) == type({}) and type(list2[i]) == type({}):x = "list"checkJson2(list1[i], list2[i])elif type(list1[i]) == type([]) and type(list2[i]) == type([]):x = "list"checkJsonList(list1[i], list2[i])else:json1_list = "json1_list_{0}".format(i)json2_list = "json2_list_{0}".format(i)content = {json1_list: list1[i],json2_list:list2[i]}json_false.append(content)_jsons = {}if bool(json_false) == True:_jsons = {"list不一致内容": json_false}if bool(_jsons) == True:_jsons = {yyyyy: _jsons}finalJson.append(_jsons)if __name__ == '__main__':try:json1,json2 = json.loads(json1),json.loads(json2)fil_path = "{0}\checkjson.txt".format(txt_path)fil = open(fil_path, mode='w+',encoding='utf-8')checejson = checkJson(json1,json2)finalJsons = {"finalJson":finalJson}finalJsons = str(finalJsons).replace("'","\"")print("校验成功,生成文件:checkjson.txt\t完整路径:{0}".format(fil_path))fil.write(finalJsons)fil.closeexcept:print("请检查json格式")

粘贴json分别放到json1.txt json2.txt 文件

cmd页面运行程序

生成了一个json文件,生成的json文件后续需要手动调整格式

2022-10-05日进行二次优化

  1. 修改验证失败, 验证成功提示内容
  2. 支持测试用例单独调用, 两个内容体一致返回1, 两个内容不一致, 返回不一致内容
  3. 原有最外层为json格式, 修改为最外层支持列表验证
  4. 优化 支持从左到右匹配, 不区分键的大小写

仅支持两层嵌套查询, 多层嵌套查询存在问题
仅支持验证json格式, list或者json.

梳理,多层嵌套验证,希望返回数据支持返回数据准确位置,存在问题

#! usr/bin/python
# coding:gbk
"""@File : checkJson.py@DataTime : 2022-10-05 19:15@Author : ChairDu@Email : chair7@163.com@Description : 验证json字符串差异
""""""
json校验, 生成新文件存放当前文件目录下
需要新建文件
json1.txt
json2.txt
分别存放两个json体
"""import os
import sys
import json
sys.path.append(os.path.dirname(os.path.dirname(__file__)))def anssertContent(content_1, content_2, jsonKey=[], searchType = 1 ):"""content_1 比对内容1content_2 比对内容2jsonKey 默认为[],上传格式为列表, 可根据上传内容进行精确验证字段值searchType  1, 返回所有内容, 2判断是否完全匹配,完全匹配成功返回1,匹配失败返回是啊比内容"""global finalJson,json_Ture,json_FalsefinalJson = {}json_Ture = {}json_False = {}listFrequency= 1jsonFrequency=1"""判断两边内容是否一致, 以左边为基数, 一致返回1, 不一致返回0"""if type(content_1) != type(content_2): # 若content_1, content_2类型不一致, 证明两边内容不一致checkJsonType = 0  elif type(content_1) == type({}): # 若content_1为json, 使用json比对checkJson(content_1, content_2, listFrequency, jsonFrequency, jsonKey)elif type(content_1) == type([]):   # 若 若content_1为列表, 使用list比对checkList(content_1, content_2, listFrequency, jsonFrequency, jsonKey)else:checkJsonType = 0finalJson = {"jsonTure":json_Ture,"jsonFalse":json_False}finalJson = dict(finalJson)if searchType == 1:return finalJsonelif searchType == 2:if  bool(finalJson.get("jsonFalse")) == False:   return 1else:return finalJson.get("jsonFalse")else:return json.dumps(finalJson, ensure_ascii=False)def checkJson(json1, json2, listFrequency, jsonFrequency, jsonKey):  jsonTure = {}   # 比对成功内容jsonFalse = {}  # 比对失败内容json1 = dict((k.lower(), v) for k, v in json1.items())    # 比对两个json的键转换为小写, 防止大小写不一致json2 = dict((k.lower(), v) for k, v in json2.items())    # 比对两个json的键转换为小写, 防止大小写不一致# jsons = {**json1, **json2}val_Key = "list_{0}".format(listFrequency)jsonKeys = [i for i in json1]if bool(jsonKey) ==  True:  # jsonKey = [(i.lower()) for i in jsonKey]jsonKeys = jsonKeyfor json1Key in jsonKeys:valKey = "{0}_{1}".format(json1Key, jsonFrequency)if json1.get(json1Key) == json2.get(json1Key):  # 如果两边json一致, 则比对内容一致    value = "比对成功, 键:{0}, json_{1} 值:{2}".format(json1Key, jsonFrequency, json1.get(json1Key))jsonTure.update({valKey:value})elif type(json1.get(json1Key)) == type({}):   # 如果josn1的下级是json, 继续调用checkJson函数, 验证json体jsonFrequency += 1checkJson(json1.get(json1Key), json2.get(json1Key), listFrequency, 1, jsonKeys)elif type(json1.get(json1Key)) == type([]):   # 如果josn1的下级是list, 继续调用checkList函数, 验证list体listFrequency += 1checkList(json1.get(json1Key), json2.get(json1Key), listFrequency, jsonFrequency, jsonKeys)else:value = "比对失败, 键:{0}, json_{1} 内容1值:{2}, 内容2值:{3}".format(json1Key, jsonFrequency, json1.get(json1Key), json2.get(json1Key))jsonFalse.update({valKey:value})value1 = {val_Key:jsonTure}value2 = {val_Key:jsonFalse}# 存在空的情况,被过滤if bool(jsonFalse) == True:json_False.update({val_Key:jsonFalse})if bool(jsonTure) == True:json_Ture.update({val_Key:jsonTure})def checkList(list1, list2, listFrequency, jsonFrequency, jsonKey):"""验证json内的list"""if len(list1) != len(list2): # 如果两个列表长度不相等, 则比对数据失败passfor i in range(len(list1)):listFrequencys = "{0}-{1}".format(listFrequency,i+1)if type(list1[i]) == type({}): # 如果列表1第i个值类型== [], 调用checkList函数checkJson(list1[i], list2[i], listFrequencys, 1, jsonKey)elif type(list1[i]) == type([]): # 如果列表1第i个值类型== {}, 调用checkJson函数 jsonFrequency += 1checkList(list1[i], list2[i], jsonFrequency, jsonFrequency, jsonKey)else:   #其他情况, 比对失败val_Key = "list_{0}".format(listFrequency)_val = {val_Key:"比对类型有误,比对失败"}json_False.update(_val)if __name__ == '__main__':# 本地调试, 下载文件至本地txt_path =  sys.path[0] # 获取文本路径,默认和当前文件一个路径content_1 = open(r"{0}\json1.txt".format(txt_path), encoding='utf-8').read()    # 读取文本1content_2 = open(r"{0}\json2.txt".format(txt_path), encoding='utf-8').read()    # 读取文本2json1, json2 = json.loads(content_1), json.loads(content_2) # 得出json1, json2a = ["actorName","playThePartOf"]finalJson = anssertContent(json1, json2, a)  # 执行json文本比对fil_path = "{0}\checkjson.txt".format(txt_path) # 生成本地路径,默认和当前文件一个路径,存储比对结果fil = open(fil_path, mode='w+',encoding='utf-8')print("校验成功,生成文件:checkjson.txt\t完整路径:{0}".format(fil_path)) finalJsons = json.dumps(finalJson, ensure_ascii=False)  # 转换json点引号为双引号fil.write(finalJsons)   # 写入文件fil.close

比对样例:

精确匹配仅支持一层列表查询

python校验两个json体相关推荐

  1. python 比较两个json文件

    python 比较两个json文件 法1:利用json_tools类库中的方法 安装pip install json_tools 使用json_tools.diff(old,new) 输出 : new ...

  2. python怎么验证两个json是不是一样_比较Python中的两个JSON树

    我有这种JSON树的文件夹结构.有什么方法可以将它与同类的Json树进行比较以获得差异(文件丢失或不同的文件属性(日期,crc,..)),并将其作为具有不同/缺失文件名称的列表返回.比较Python中 ...

  3. python快速比较两个json_Python 比较两个json的方法

    在测试过程中经常会对比两个json的异同,如果当json串较长时,一个一个的对比显然是很浪费时间的. 所以写一个比较json异同的测试方法是很有必要的. 下面介绍一下比较json异同的两种方法,以及测 ...

  4. jq处理返回来json_4个小窍门,让你在Python中高效使用JSON

    全文共1990字,预计学习时长5分钟 图源:unsplash 字典和列表是 Python的两种数据类型,也是用来处理JSON的完美工具.本文将主要分享以下内容: · 如何载入.编写JSON? · 如何 ...

  5. python json操作_4个小窍门,让你在Python中高效使用JSON

    字典和列表是 Python的两种数据类型,也是用来处理JSON的完美工具.本文将主要分享以下内容: 如何载入.编写JSON? 如何在命令行上优化.校验JSON? 如何通过使用JMESPath对JSON ...

  6. Python:数据提取之JSON与JsonPATH

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景,比如网站前台与 ...

  7. Python基础教程:json中load和loads区别

    相同点 dump 和 dumps 都实现了序列化 load 和 loads 都实现反序列化 变量从内存中变成可存储或传输的过程称之为序列化 序列化是将对象状态转化为可保存或可传输格式的过程. 变量内容 ...

  8. python怎么使用json_Python JSON的简单使用

    1 json简介 1.1 json是什么? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式. "在JSON出现之前,大家一直用XML来传递数据.因 ...

  9. python3解释器执行not 1 and 1_编程语言的分类,python解释器多版本共存.执行python的两种方式,变量,用户与程序交互...

    一.编程语言的分类? 机器语言:直接使用二进制指令编程,直接操作硬件,必须考虑硬件细节. 汇编语言:用简写的英文标识符取代二进制去编写程序,直接操作硬件,必须考虑硬件细节. 高级语言:通过人类能够理解 ...

最新文章

  1. Javascript闭包和闭包的几种写法及用途
  2. 一个二维码能装10T电影?看样子我也能改变世界了
  3. 【Spark】为什么没有任务调度到新增的Worker之上???
  4. Zookeeper_安全认证讲解
  5. 牛客多校9 - Groundhog Chasing Death(质因子分解+思维)
  6. android 自定义loading,android_自定义Loading框
  7. 一.因子图优化学习---董靖博士在深蓝学院的公开课学习(1)
  8. Windows下搭建SVN服务器 - Visual SVN server
  9. 差分相干解调 matlab,2DPSK差分相干解调器Simulink仿真.doc
  10. Unity 接入百度AI - Logo商标识别
  11. Java使用aspose将word文档转换为pdf
  12. 教你在 Markdown 文档中借助 MathType 公式编辑器插入 LaTeX 公式
  13. 解决Windows 无法打开文件夹 找不到应用程序
  14. ikbc机械键盘打字出现重复_再也不怕半夜打字影响家人了——ikbc c104机械键盘评测...
  15. 【案例 4-2】饲养员喂养动物
  16. 计算机工程与科学期刊小木虫,《[小木虫emuch.net]北大中文核心期刊目录(2016版)--2016年4月12日更新》.pdf...
  17. php 获取手机设备id,H5获取手机设备信息、app版本信息、ip地址
  18. Net2FTP搭建免费web文件管理器『打造个人网盘』
  19. 华为eNSP配置dhcp 下发ipv4地址
  20. 是——我说明白了么?而不是——你听懂了么?

热门文章

  1. 浅谈房地产管理系统的有利于销售的功能
  2. Web系统存在的意义到底是什么?
  3. MercadoLibre美客多开店须知及指引
  4. 我要学计算机表情包,确认过表情包,怕是遇上学计算机的“同道中人”了
  5. 生意参谋牵手Quick BI 让数据再次驱动店铺经营
  6. SQL应用:用SQL做区域销售分析
  7. 计算机毕业设计之java+javaweb的美容院管理系统
  8. 3月郑州空气质量14天“良” 全国排名倒数16位
  9. 使用 JS 打印100以内 7的倍数
  10. vue实现直播弹幕功能