python校验两个json体

问题: 有两个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 文件
python校验两个json体_第1张图片
cmd页面运行程序
python校验两个json体_第2张图片
生成了一个json文件,生成的json文件后续需要手动调整格式
python校验两个json体_第3张图片

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 : [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






比对样例:
python校验两个json体_第4张图片

精确匹配仅支持一层列表查询
python校验两个json体_第5张图片
python校验两个json体_第6张图片

你可能感兴趣的:(脚本,python)