python 比较两个json文件

法1:利用json_tools类库中的方法

  1. 安装pip install json_tools
  2. 使用json_tools.diff(old,new)

输出 : new参数相对于old参数发生的变化

demo:

  • 1.读取新旧json文件(也可以用json.loads方法读取json字符串)相关资料可以参考笔者写的另一篇博客:有关json读取的相关资料
  • 2.利用json_tools.diff(old,new)进行比较
  • 3.将结果保存至文件(也可直接对结果进行处理)
with open('/home/output/test/10.json','r',encoding='utf-8')as f:
        new10=json.load(f)
    with open('/home/test/result/10.json','r',encoding='utf-8')as f:
        old10=json.load(f)
    with open(os.path.join("/home/output/compare", "cmp{}.json".format(i)), "w", encoding='utf-8') as f:
     # 将比较结果写入文件
    json.dump(json_tools.diff(old10,new10), f, ensure_ascii=False, indent=4)

法2:根据json内容直接比较

注:此处例子代码为作者对法1产生的结果进行的二次处理,原理相同

编写思路:

  • 1.肉眼分析现有的json文件
    以法1保存的比较结果的json文件为例
[{
        "replace": "doc_id",
        "value": "87a470dce53abdc6b7a175751920ea",
        "prev": "ab9a5bdf-60b0-b557-bb7918e3"
    },
    {
        "replace": "某字段",
        "value": "新值",
        "prev": "旧值"
    },
 ]
  • 2.读取json文件 并利用json.load转换为python类 或者读取json格式字符串 利用json.loads转换为python类 有关json读取的相关资料
open(os.path.join("/home/output/compare", "cmp{}.json".format(i)), "r", encoding='utf-8') as f:#打开文件
            cmpInfo=json.load(f)#转化成python类
  • 3.对转化后的python类进行处理
    例如,法1生成的信息结构为 dict类型的list数组因此很容易想到利用for循环对数组进行遍历,每一个元素为一个dict,之后再对dict就行处理就可以了
cmpInfo=json.load(f)#上一步读取的信息
            for dict_info in cmpInfo:#对数组进行遍历
                if addReplaceCnt(dict_info,'某字段'):# 实现的针对法1提取出的replace信息的再次处理的函数
                    continue
                if addReplaceCnt(dict_info, '字段2'):
                    if dict_info['value']=="xxx" and dict_info['prev']=='yyy':
                        ###其他代码
  • 4.可以对上述结构进行统计、整理、总结等,自由发挥

我的demo代码:

for i in range(1,150):
        with open(os.path.join("/home/output/compare", "cmp{}.json".format(i)), "r", encoding='utf-8') as f:
            cmpInfo=json.load(f)
            for dict_info in cmpInfo:
                if addReplaceCnt(dict_info,'某字段'):# 实现的针对法1提取出的replace信息的再次处理
                    continue
                if addReplaceCnt(dict_info, '字段2'):
                    if dict_info['value']=="xxx" and dict_info['prev']=='yyy':
                        dictCnt['xxxx']+=1
                    continue
                if addReplaceCnt(dict_info, '字段3'):
                    testNull(dict_info,'value')
                    continue
                if addReplaceCnt(dict_info, 'xxx'):
                    continue
    #其他代码
    #其他代码
    print("统计完成.")