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

news/2025/2/12 9:09:12/

  记录瞬间

前段时间为了解决一些实际问题,引出了要对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/news/1571378.html

相关文章

DeepSeek Janas-Pro 图像模型

DeepSeek Janus-Pro 是由 DeepSeek 团队开发的一款开源多模态大模型,旨在统一图像理解和生成任务,并在多个领域展现出卓越的性能。以下是对其主要特点和功能的详细介绍: 1. 模型架构与技术特点 解耦视觉编码路径:Janus-Pro 采用解耦的视觉编码路径,将图像理解与生成任务分…

分层解耦-IOC DI 入门

步骤 ①.Service层及 Dao层的实现类&#xff0c;交给I0C容器管理。 ②.为Controller及Service注入运行时&#xff0c;依赖的对象。 ③.运行测试。 添加注解进行分层耦合 Component 会将当前类交给IOC容器管理,成为IOC容器中的bean - 控制反转 Autowired 运行时,IOC容器…

python:递归函数与lambda函数

递归函数&#xff1a;1.函数内调用自己 2.有一个出口 1.递归 一.有出口时 def sum(num):if num1:return 1return numsum(num-1) asum(3) print(a) #num3 3sum(2) #num2 2sum(1) #num1是返回1 #即3sum(2&#xff09;即32sum(1)即321运行结果 6 二.无出口时 def sum(num)…

【DeepSeek × Postman】请求回复

新建一个集合 在 Postman 中创建一个测试集合 DeepSeek API Test&#xff0c;并创建一个关联的测试环境 DeepSeek API Env&#xff0c;同时定义两个变量 base_url 和 api_key 的步骤如下&#xff1a; 1. 创建测试集合 DeepSeek API Test 打开 Postman。点击左侧导航栏中的 Co…

uniapp中使用uCharts折线图X轴数据间隔显示

1、先看官网 https://www.ucharts.cn/ 2、设置代码 "xAxisDemo3":function(val, index, opts){if(index % 2 0){return val}else {return }}, 再在数据中引入设置好样式

jQuery介绍(快速、简洁JavaScript库,诞生于2006年,主要目标是简化HTML文档操作、事件处理、动画和Ajax交互)

文章目录 **核心功能 & 亮点**1. **简化 DOM 操作**2. **链式调用**3. **跨浏览器兼容**4. **便捷的事件绑定**5. **Ajax 封装**6. **动画效果** **现状与适用场景**- **传统项目维护**&#xff1a;许多旧系统&#xff08;如 WordPress 插件、老企业网站&#xff09;仍依赖…

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…

数​字​政​通​一​面

1. 请尽可能详细地说明&#xff0c;虚拟dom是什么&#xff0c;它的产生是为了解决哪些问题的&#xff1f;你的回答中不要写出示例代码。 虚拟DOM&#xff08;Virtual DOM&#xff09; 定义 虚拟DOM是一个轻量级的JavaScript对象&#xff0c;它是真实DOM&#xff08;Document…