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

embedded/2025/2/11 22:55:46/

  记录瞬间

前段时间为了解决一些实际问题,引出了要对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)returnif 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.ppmy.cn/embedded/161445.html

相关文章

解释和对比“application/octet-stream“与“application/x-protobuf“

介绍 在现代 Web 和分布式系统的开发中&#xff0c;数据的传输和交换格式扮演着关键角色。为了确保数据在不同系统之间的传输过程中保持一致性&#xff0c;MIME 类型&#xff08;Multipurpose Internet Mail Extensions&#xff09;被广泛应用于描述数据的格式和内容类型。在 …

transformers学习笔记——初级篇

Transformers&#xff08;库&#xff09; 是 Hugging Face 开发的 开源 Python 库&#xff0c;用于加载和使用基于 Transformer 结构的各种预训练模型。Transformers&#xff08;库&#xff09;是对 Transformer&#xff08;理论&#xff09;的工程实现&#xff0c;并且包含了很…

Linux第106步_Linux内核RTC驱动实验

1、了解rtc_device结构体 1)、打开“include/linux/rtc.h” rtc_class_ops是需要用户根据所使用的RTC设备编写的,其结构体如下: struct rtc_class_ops { int (*ioctl)(struct device *, unsigned int, unsigned long);/*函数指针ioctl*/ int (*read_time)(struct device *,…

变化检测论文阅读合集

1. ChangeCLIP: Remote sensing change detection with multimodal vision-language representation learning 作者&#xff1a;Sijun Dong a, Libo Wang b, Bo Du c, Xiaoliang Meng a,* 年份&#xff1a;2024 研究方法/模型&#xff1a; 重构原始CLIP&#xff1a;提取双时…

计算机毕业设计Spark+大模型知网文献论文推荐系统 知识图谱 知网爬虫 知网数据分析 知网大数据 知网可视化 预测系统 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【AI绘画】MidJourney关键词{Prompt}全面整理

AI绘画整理&#xff0c;MidJourney关键词。喜欢AI绘画的朋友必备&#xff0c;建议收藏&#xff0c;后面用到时供查阅使用。 1、光线与影子篇 中 英 闪耀的霓虹灯 shimmeringneon lights 黑暗中的影子 shadows in the dark 照亮城市的月光 moonlightilluminatingthe cit…

Node.js调用DeepSeek Api 实现本地智能聊天的简单应用

在人工智能快速发展的今天&#xff0c;如何快速构建一个智能对话应用成为了开发者们普遍关注的话题。本文将为大家介绍一个基于Node.js的命令行聊天应用&#xff0c;它通过调用硅基流动&#xff08;SiliconFlow&#xff09;的API接口&#xff0c;实现了与DeepSeek模型的智能对话…

matlab simulink 汽车四分之一模型主动被动悬架-LQR

1、内容简介 略 matlab simulink 可以交流、咨询、答疑 124- 2、内容说明 略汽车悬架系统由弹性元件、导向元件和减振器组成,是车身与车轴之间连接的所有组合体零件的总称,也是车架(或承载式车身)与车桥(或车轮)之间一切力传递装置的总称,其主要功能是使车轮与地面有很好的…