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網頁中,作為呈現的文本。

 

 

 

 

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM