json数据比较器
不仅支持对json对象、数组的直接比较,还支持嵌套的复杂json对象和数组的直接比较。
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@Author: 思文伟
'''
import json
class JSONCheckpoint(object):
"""JSON格式数据检查点,支持两个复杂JSON直接比较
JSON 数据写为名称/值对。 名称/值由字段名称构成,后跟冒号和值:{ "name":"Bill Gates" }
在 JSON 中,值必须是以下数据类型之一:
字符串
数字
对象(JSON 对象)
数组
布尔
null
Simple usage:
alist = [{
"status": "success",
"data": {
"44131521": [{
"joinno": "201812120000013935",
"zzbcode": "44131521",
}, {
"joinno": "201812120000013936",
"zzbcode": "44131521",
}, {
"joinno": "201812120000013937",
"zzbcode": "44131521",
}]
}
}]
elist = [{
"status": "success",
"data": {
"44131521": [{
"joinno": "201812120000013937",
"zzbcode": "44131521"
}, {
"joinno": "201812120000013935",
"zzbcode": "44131521",
}, {
"joinno": "201812120000013936",
"zzbcode": "44131521",
}]
}
}]
JSONCheckpoint().test(alist, elist, False)
"""
CONVERT_JSON_TEXT_TO_PYTHON_OBJECT = True
def to_py_obj(self, json_text):
return json.loads(json_text)
def test(self, actual, expected, convert=CONVERT_JSON_TEXT_TO_PYTHON_OBJECT, ignore_position=True, list_strict=True, dict_strict=True):
"""比较两个对象是否相等
Args:
- actual: 实际
- expected: 预期
- ignore_position: 控制是调用忽略位置比较函数还是完全相等比较函数 True - 忽略位置 False - 完全相等
- list_strict: ignore_position为True的时候,该参数才有意义
- dict_strict: ignore_position为True的时候,该参数才有意义
"""
if convert == self.CONVERT_JSON_TEXT_TO_PYTHON_OBJECT:
expected = self.to_py_obj(expected)
print(self.equals(actual, expected, ignore_position=ignore_position, list_strict=list_strict, dict_strict=dict_strict))
def equals(self, actual, expected, ignore_position=True, list_strict=True, dict_strict=True):
"""比较两个对象是否相等
Args:
- actual: 实际
- expected: 预期
- ignore_position: 控制是调用忽略位置比较函数还是完全相等比较函数 True - 忽略位置 False - 完全相等
- list_strict: ignore_position为True的时候,该参数才有意义
- dict_strict: ignore_position为True的时候,该参数才有意义
"""
if isinstance(expected, (list, tuple)) and isinstance(actual, (list, tuple)):
if ignore_position:
return self.json_array_equals_ignore_position(actual, expected, list_strict=list_strict, dict_strict=dict_strict)
else:
return self.json_array_equals(actual, expected)
elif isinstance(expected, dict) and isinstance(actual, dict):
if ignore_position:
return self.json_obj_equals_ignore_position(actual, expected, dict_strict=dict_strict, list_strict=list_strict)
else:
return self.json_obj_equals(actual, expected)
elif isinstance(expected, bool) or isinstance(actual, bool): # 任意一个是bool值,则进行bool值比较
return self.all_is_same_bool_value(actual, expected)
elif expected is None or actual is None: # 任意一个是None值,则进行None比较
return self.all_is_none(actual, expected)
else:
return actual == expected
def _group(self, dlist):
"""根据数据类型对列表的子元素分组,分组规则如下: