当前位置: 首页 > article >正文

python实现比对两个json串的方法

  记录瞬间

前段时间为了解决一些实际问题,引出了要对json字符串进行比对的需求。

觉得有意义,作以简单记录。

# 比对数据
def compare_data(set_key, src_data, dst_data, noise_data, num):
    if isinstance(src_data, dict) and isinstance(dst_data, dict):
        """若为dict格式"""
        for key in dst_data:
            if key not in src_data:
                print("src不存在这个key")
                noise_data[key] = "src不存在这个key"
        for key in src_data:
            if key in dst_data:
                if src_data[key] != dst_data[key] and num == 1:
                    noise_data[key] = "容忍不等"
                if src_data[key] != dst_data[key] and num == 2:
                    noise_data[key] = {}
                    noise_data[key]["primary"] = src_data[key]
                    noise_data[key]["candidate"] = dst_data[key]
                """递归"""
                compare_data(key, src_data[key], dst_data[key], noise_data, num)
            else:
                noise_data[key] = ["dst不存在这个key"]
    elif isinstance(src_data, list) and isinstance(dst_data, list):
        """若为list格式"""
        if len(src_data) != len(dst_data) and len(set_key) != 0:
            print("list len: '{}' != '{}'".format(len(src_data), len(dst_data)))
            noise_data[set_key]["primary"] = str(src_data)
            noise_data[set_key]["candidate"] = str(dst_data)
            return
        if len(src_data) == len(dst_data) and len(src_data) > 1:
            for index in range(len(src_data)):
                for src_list, dst_list in zip(sorted(src_data[index]), sorted(dst_data[index])):
                    """递归"""
                    compare_data("", src_list, dst_list, noise_data, num)
        else:
            for src_list, dst_list in zip(sorted(src_data), sorted(dst_data)):
                """递归"""
                compare_data("", src_list, dst_list, noise_data, num)
    else:
        if str(src_data) != str(dst_data):
            print("src_data", src_data, "dst_data", dst_data)
    return noise_data

代码实现了出入的src_data、dst_data两个字符串,noise_data作为记录两个字符串的差异进行返回。

set_key是对json串中存在key值对应的list列表时,比对了列表长度不等,我们认为不需要在对列表中的具体元素进行对比。

num区分第一次对比和第二次对比时需要记录的选项。

# 分析获取的数据,并清空存储
def analyse_data():
    noise_data1 = {}
    mark_result = compare_data("", response["primary"], response["secondary"], noise_data1, 1)
    noise_data2 = {}
    comp_result = compare_data("", response["primary"], response["candidate"], noise_data2, 2)
    td1 = "<tr><td style=\"background-color: #fcf8e3\">"
    td2 = "</td><td style=\"width: 45%;padding: 8px;background-color: " \
          "#dff0d8;line-height: 1.42857143;vertical-align: left;\"><pre style=\"white-space: pre-wrap!important;" \
          "word-wrap: break-word!important;*white-space:normal!important;\">"
    diff_td2 = "</td><td style=\"width: 45%;padding: 8px;background-color: " \
          "#dff0d8;line-height: 1.42857143;vertical-align: left;\">"
    diff_td3 = "</td><td style=\"width: 45%;padding: 8px;background-color: " \
          "#dff0d8;line-height: 1.42857143;vertical-align: left;\">"
    with open("./result.html", mode="a", encoding="UTF-8") as f:
        print(td1 + "Response : ", td2 + json.dumps(response["primary"], indent=4, ensure_ascii=False) + "</pre>" +
              td2 + json.dumps(response["candidate"], indent=4, ensure_ascii=False) + "</pre></td></tr>", file=f)
    print("mark = ", mark_result)
    print("comp = ", comp_result)
    if (len(comp_result) - len(mark_result)) > 0:
        diff_td = "<tr><td rowspan=\"" + str(len(comp_result) - len(mark_result)) + "\" style=\"background-color: #bf466a\">"
        print("diff_td = ", diff_td)
        with open("./result.html", mode="a", encoding="UTF-8") as f:
            print(diff_td + "Diff Result ", file=f)
    for key in comp_result:
        if key not in mark_result:
            try:
                with open("./result.html", mode="a", encoding="UTF-8") as f:
                    print(diff_td2 + key + "->" + str(noise_data2[key]["primary"]) +
                          diff_td3 + str(noise_data2[key]["candidate"]) + "</td></tr><tr>", file=f)
                    # print(key + " = A:" + str(noise_data2[key]["primary"]) + "<->D:" + str(noise_data2[key]["candidate"]) 
            #     + " Maybe a new bug.", file=f)
                print(key, "有可能是bug,要检查了。", str(noise_data2[key]["primary"]), str(noise_data2[key]["candidate"]))
            except Exception as e:
                with open("./result.html", mode="a", encoding="UTF-8") as f:
                    print(td1 + "Diff Result : ", td2 + str(noise_data2[key]["primary"]) + "</pre>" +
                          td2 + str(noise_data2[key]["candidate"]) + "</pre></td></tr>", file=f)
                    # print(key + " = A:" + str(noise_data2[key]["primary"]) + "<->D:" + str(noise_data2[key]["candidate"]) 
            #     + " Maybe a new bug.", file=f)
                print(e)

    noise_data1.clear()
    noise_data2.clear()
    response.clear()

这里的response作为全局的变量进行使用。我们在获取了噪音数据noise_data1和noise_data2时,对噪音数据进行比对。

添加到result.html网页中,作为呈现的文本。

============================================


http://www.kler.cn/a/544247.html

相关文章:

  • Spring Security 学习大纲
  • vue项目 Axios创建拦截器
  • Python基于Django的微博热搜、微博舆论可视化系统(V3.0)【附源码】
  • Leetcode - 周赛435
  • C++基础学习记录—this指针
  • 办公用品管理系统需求说明
  • 二、交换机的vlan子设备接入
  • 爬虫逆向学习(十六):某方数据protobuf协议逆向解析
  • untiy3D为游戏物体制作简单的动画
  • 提示词生成新方法,用Make自动化生成
  • MongoDB基础入门
  • Maven Profile 配置:支持不同环境的构建
  • 回环地址127.0.0.1跟自身IP有什么区别?
  • 简述MySQL主从复制原理及其工作过程,配置一主两从并验证
  • 订单自动关闭方案设计
  • 如何在Linux中设置定时任务(cron)
  • 使用 React 16+Webpack 和 pdfjs-dist 或 react-pdf 实现 PDF 文件显示、定位和高亮
  • 【C#零基础从入门到精通】(十一)——C#Reandom随机类详解
  • 1.攻防世界 unserialize3(wakeup()魔术方法、反序列化工作原理)
  • 2、k8s 二进制安装(详细)
  • 《qt open3d中添加随机点采样》
  • ubuntu部署snmp
  • 深入解析:如何利用期货Level2高频Tick数据洞察市场动态
  • 变形的宽搜 育才官网 HN036 涂色游戏
  • Windows中使用Docker安装Anythingllm,基于deepseek构建自己的本地知识库问答大模型,可局域网内多用户访问、离线运行
  • JVM 类加载子系统在干什么?