当前位置:   article > 正文

python 之 json diff 工具类_python json diff

python json diff

一:背景

json作为一种常用的数据交换格式,在日常coding中,出现的频率非常之高。

在测试的时候,可以方便的对json进行比较也是非常频繁的需求

一个简单版本的实现,这里用作记录

二:代码

1. python版本

import json

def diff(a, b):
    """
    :param a: dict
    :param b: dict
    :return: dict
    """
    result = {}
    # 遍历a,获取在b中不存在,或者是和b中的value不一致的对象
    for key in a:
        if key in b:
            a_val = a[key]
            b_val = b[key]

            if a_val != b_val:
                if (type(a_val) == dict) & (type(b_val) == dict):
                    inner_result = diff(a_val, b_val)
                    result[key] = inner_result
                else:
                    result[key] = {'left': a_val, 'right': b_val}
        else:
            result[key] = {'left': a[key], 'right': '-'}

    # 遍历b,获取在a中不存在
    for key in b:
        if key not in a:
            result[key] = {'left': b[key], 'right': '-'}

    return result


if __name__ == '__main__':
    s = """
    {
    "r":{
        "sd":23,
        "d":33
    },
    "a":12,
    "i":98
    }
    
    """

    s2 = """
    {
        "r":{
        "sd":23,
        "d":35
    },
        "a":14,
        "b":78,
        "i":98
        }

        """

    result = diff(json.loads(s), json.loads(s2))
    print(json.dumps(result, indent=2))

  • 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
'
运行

在这里插入图片描述

结果解释:
在整个结果dict 中,key分为三种情况:
1)left:value对应在diff方法中传入的第一个参数的value
2)right:value对应在diff方法中传入的第二个参数的value
3)如果是非1和2两种情况,那么就说明该key是diff方法中传入的两个dict参数中value不同的key。

如上面的结果中:

  1. 首先看到r,那说明在参数a和b中,r对应的value是不一样的;
  2. 发现r的下一层是key为d,那就说明在a和b中r对应的value必然也是一个dict,而在这个子层dict中,其他key为d的value在两者是不同的;
  3. 继续往下看,看到d对应的value有两个key,分别是left和right,那就说明left对应的value为d在a中对应的值,right对应的value为d在b中对应的值。
  4. 对应某一个key只在a或者是b中存在,那么不存在的那边会以-来代替value

三:总结

先实现python版本的,是因为在json.loads方法中,如果子层结果为dict,那么可以自动识别到,所有上面直接判断了是否为dict类型

todo:可视化,其他语言版本

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/788175
推荐阅读
相关标签
  

闽ICP备14008679号