json数据比较器

这是一个Python类,用于比较复杂的JSON对象和数组,支持嵌套结构,并提供了多种比较选项,如忽略位置、列表严格性和字典严格性。通过`test`方法,可以检查两个JSON数据是否相等。
摘要由CSDN通过智能技术生成

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):
        """根据数据类型对列表的子元素分组,分组规则如下:
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值