问题: 有两个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 : [email protected]
@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 x
yyyyy = "JOSN体整体比对:{0}".format("")
if json1.get(json_keys) == json2.get(json_keys):
# content = {json_keys:json1.get(json_keys)}
content = json_keys
json_ture.append(content)
elif bool(json1.get(json_keys)) == False:
# content = {json_keys: json2.get(json_keys)}
content = json_keys
json1_null.append(content)
elif bool(json2.get(json_keys)) == False:
# content = {json_keys: json1.get(json_keys)}
content = json_keys
json2_null.append(content)
else:
if type(json1.get(json_keys)) == type({}):
x = json_keys
checkJson2(json1.get(json_keys),json2.get(json_keys))
if type(json1.get(json_keys)) == type([]):
x = json_keys
checkJsonList(json1.get(json_keys),json2.get(json_keys))
content = {json_keys: {"json1":json1.get(json_keys),"json2":json2.get(json_keys)}}
content = json_keys
json_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 x
yyyyy = "JOSN详细比对:{0}".format(format(x))
if json1.get(json_keys) == json2.get(json_keys):
pass
elif 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_keys
checkJson2(json1.get(json_keys), json2.get(json_keys))
elif type(json1.get(json_keys)) == type([]):
x = json_keys
checkJsonList(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 x
yyyyy = "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]:
pass
elif 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.close
except:
print("请检查json格式")
粘贴json分别放到json1.txt
json2.txt
文件
cmd页面运行程序
生成了一个json文件,生成的json文件后续需要手动调整格式
仅支持两层嵌套查询, 多层嵌套查询存在问题
仅支持验证json格式, list或者json.
梳理,多层嵌套验证,希望返回数据支持返回数据准确位置,存在问题
#! usr/bin/python
# coding:gbk
"""
@File : checkJson.py
@DataTime : 2022-10-05 19:15
@Author : ChairDu
@Email : [email protected]
@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 比对内容1
content_2 比对内容2
jsonKey 默认为[],上传格式为列表, 可根据上传内容进行精确验证字段值
searchType 1, 返回所有内容, 2判断是否完全匹配,完全匹配成功返回1,匹配失败返回是啊比内容
"""
global finalJson,json_Ture,json_False
finalJson = {}
json_Ture = {}
json_False = {}
listFrequency= 1
jsonFrequency=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 = 0
finalJson = {"jsonTure":json_Ture,"jsonFalse":json_False}
finalJson = dict(finalJson)
if searchType == 1:
return finalJson
elif searchType == 2:
if bool(finalJson.get("jsonFalse")) == False:
return 1
else:
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 = jsonKey
for 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 += 1
checkJson(json1.get(json1Key), json2.get(json1Key), listFrequency, 1, jsonKeys)
elif type(json1.get(json1Key)) == type([]): # 如果josn1的下级是list, 继续调用checkList函数, 验证list体
listFrequency += 1
checkList(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): # 如果两个列表长度不相等, 则比对数据失败
pass
for 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 += 1
checkList(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() # 读取文本1
content_2 = open(r"{0}\json2.txt".format(txt_path), encoding='utf-8').read() # 读取文本2
json1, json2 = json.loads(content_1), json.loads(content_2) # 得出json1, json2
a = ["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