JsonClass.py
4.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/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))