zoukankan      html  css  js  c++  java
  • 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=" 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=" 45%;padding: 8px;background-color: " 
              "#dff0d8;line-height: 1.42857143;vertical-align: left;">"
        diff_td3 = "</td><td style=" 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网页中,作为呈现的文本。

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

  • 相关阅读:
    EntityFramework 迁移遇到的问题
    Eclipse下使用PySpark报Could not find valid SPARK_HOME while searching
    Eclipse下使用PySpark报Could not find valid SPARK_HOME while searching
    Eclipse下使用PySpark报Could not find valid SPARK_HOME while searching
    Eclipse下使用PySpark报Could not find valid SPARK_HOME while searching
    通过fiddler抓取IDEA的请求
    Visual Studio中你所不知道的智能感知
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    区块链的诞生及演化
  • 原文地址:https://www.cnblogs.com/wozijisun/p/10337040.html
Copyright © 2011-2022 走看看