JsonClass.py 4.77 KB
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import json
import operator


def dict_diff(a1,b1):
    #提取出dict与str或list的异常对比场景
    if type(a1)!= type(b1):
        print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1)))
        return False
    d1=list(set(a1.keys()).difference(set(b1.keys())))
    d2=list(set(b1.keys()).difference(set(a1.keys())))
    if len(d1)==0 and len(d2)==0:
        return True
    else:
        print("实际json比期望json多了键值",d1)
        print("实际json比期望json少了键值",d2)
        return False

def list_diff(a1,b1):
    #提取出list与str或dict的异常对比场景
    if type(a1)!= type(b1):
        print("实际响应json的元素{}的类型{}和期望响应json元素{}的类型{}不一致".format(a1,type(a1),b1,type(b1)))
        return False
    elif len(a1)!=len(b1):
        print("实际响应json列表长度{}和期望响应json列表长度{}不一致".format(a1,b1))
        return False
    else:
        return True

#无法判断[[1],[2]]和[[1],[1]]的区别,只能判断列表长度和字典键值是否一致
#a为实际对比的json数据,b为期望的json数据
def compare_json(a,b):
    #判断检查数据是否为列表格式的数据
    if isinstance(a,list):
        if list_diff(a,b)==True:
            #为列表时必须进行排序,否则可能出现列表对比的位置不一致
            a.sort()
            b.sort()
            for i in range(len(a)):
                #判断列表中的指定的元素是否为字典格式
                if compare_json(a[i],b[i]) == False:
                        return False 
        else:
            return False
    #判断检查数据是否为字典格式的数据
    elif isinstance(a,dict):
        if dict_diff(a,b)==True:
            #如果第一层键值相同时,遍历检查内层所有键值
            for key in a.keys():
                #内层键值为列表数据类型时
                if compare_json(a[key],b[key]) == False:
                    return False
        else:
            return False
    #期望数据非dict和list类型时,直接进行对比
    elif operator.eq(a, b)==False:
        print("实际数据的{}和期望数据的{}不一致".format(a,b))
        return False

#字典嵌套字典,完全相同
a1={"key1": 0,"key2": {"key11": 0,"key22": {"key111": 0,"key222": 0,"key333":0}}}
b1={"key1": 0,"key2": {"key11": 0,"key22": {"key111": 0,"key222": 0,"key333":0}}}
#字典嵌套字典,实际数据多了键值key33,实际少了键值key333
a2={"key1": 0,"key2": {"key11": 0,"key22": {"key111": 0,"key222": 0,"key33":0}}}
b2={"key1": 0,"key2": {"key11": 0,"key22": {"key111": 0,"key222": 0,"key333":0}}}
#列表嵌套列,完全相同但顺序不一致
a3=["key11","key22",["key11","key22",["key111",{"key1111":1}]]]
b3=[["key11","key22",["key111",{"key1111":1}]],"key11","key22"]
#列表嵌套列,顺序不一致,实际数据多了键值key111,实际少了键值key1111
a4=["key11","key22",["key11","key22",["key111",{"key111":1}]]]
b4=[["key11","key22",["key111",{"key1111":1}]],"key11","key22"]
#列表嵌套列表,顺序不一致,列表值不一致
a5=["key","key22",["key11","key22",["key111"]]]
b5=["key11","key22",["key11","key22",["key111"]]]
#列表嵌套列表,顺序一致,但是列表长度不一致
a6=["key","key22",["key11","key22",["key111"]]]
b6=["key11","key22",["key11","key22",["key111",{"key1111":1}]]]
#字典和列表相互嵌套,实际数据多了键值key2,实际少了键值key22
a7={"key1":0,"key2": ["key11",{"key2": {"key111":0,"key222": ["key111","key222"]}}]}
b7={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111","key222"]}}]}
#字典和列表相互嵌套,实际数据某一个列表长度大于期望数据
a8={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111"]}}]}
b8={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111","key222"]}}]}
#字典和列表相互嵌套,实际数据某一个列表的值和期望数据的值不一致
a9={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111","key22211"]}}]}
b9={"key1":0,"key2": ["key11",{"key22": {"key111":0,"key222": ["key111","key222"]}}]}
"""exception"""
#字典和字符串对比
a10=[{"key11": 0},{"key11": 0}]
b10=["key11","key33"]
#字典和list对比
a11=[{"key11": 0},{"key11": 0}]
b11=[["key11"],["key33"]]
#列表与字典对比
a12=[["key11"],["key33"]]
b12=[{"key11": 0},{"key11": 0}]
#列表与字符串对比
a13=[["key11"],["key33"]]
b13=["key11","key11"]
#字符串与列表对比
a14=["key11","key11"]
b14=[["key11"],["key33"]]
#字符串与字典对比
a15=["key11","key33"]
b15=[{"key11": 0},{"key11": 0}]

print(compare_json(a9,b9))