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网页中,作为呈现的文本。
============================================
python实现比对两个json串的方法的更多相关文章
- 比较任意两个JSON串是否相等(比较对象是否相等)JAVA版
废话少说,直接入题. 在面向对象语言中,经常会比较两个对象是否相等,而比较的大多是实体类实例,也就是封装数据的那些类实例,或者是Map.List互相嵌套成的复杂数据结构. 比较对象是否相等,常见的思路 ...
- 9-2、大型项目的接口自动化实践记录----递归判断两个json串是否相等
1.已知json串构成的情况下判断 先构造一下场景,假设已经把各个数据都移除掉不对比的字段 图1 预期.实际结果,复杂接口返回多层嵌套json时,同下 图2 预期.实际结果值为:{child_json ...
- Python: 自定义类对象序列化为Json串
之前已经实现了Python: Json串反序列化为自定义类对象,这次来实现了Json的序列化. 测试代码和结果如下: import Json.JsonTool class Score: math = ...
- Python中读取文件中的json串,并将其写入到Excel表格中
Json:JavaScript Objective Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用语http请求中, ...
- python 单双引号交替的json串
单双引号交替的json串 1.常见的json串,类似于这种{"isSucess":true, "name":"yoyo", "st ...
- 含有特殊字符的JSON串解析方法
工具方法:public static <T> T parseJsonString(String json,Class<T> classType){ ObjectMapper m ...
- [原创] C# dynamic拼接Json串
using Newtonsoft.Json; 之前拼接两个json串,是用的这样的代码 , json1.Length - ); json2 = json2.Insert(json2 - , tmp); ...
- 怎么解析json串在.net中
以前知道一种解析json串的方法,觉得有点麻烦.就从别的地方搜到了另一种 string json = vlt.getlist(); JObject jo = JObject.Parse(json); ...
- 在.net中怎么解析json串 [Error reading JObject from JsonReader. Current JsonReader item is not an obj]
编辑时间:2017-05-10,增加一种转化list的方法 一.以前知道一种解析json串的方法,觉得有点麻烦.就从别的地方搜到了另一种 string json = vlt.getlist(); JO ...
随机推荐
- 优化实现Mobile/Bumped Diffuse
在上一篇帖子的基础上增加一张法线贴图即可: Shader "James/Scene/Bumped_Diffuse" { Properties { _MainTex ("B ...
- ORACLE拼日期
Oracle数据库拼字符串是用"||"连接的.在开发中,经常会用到时间范围的查询 例如 startTime >='2017-05-22 00:00:00' and endT ...
- 对世界首款“人工智能”ERP系统HUE的初步了解 - AI ERP - WAP - 万革始
偶然的机会,刚好在查找机器人王国[奇妙的餐厅]的时候,看到开发[光的王国],[奇妙的宾馆],[奇妙的餐厅]等豪斯登堡集团在3月17日采用了这个传说中的世界首款人工智能ERP系统AI WORKS的下面4 ...
- 把去世的亲友做成聊天机器人,就能让生者慰藉、死者安息吗? - 看了 寻梦历险记,我的回答是 :是的,他/她永远活在我们心里 www.iremember.com.cn
AppU 如今的我们,之所以离不开手机和互联网,是因为它们确实可以带来信息和方便,让我们轻松记录并分享自己的生活体验,留下了充满回忆的各种文字.语音,各种图片.视频…… 但你有没有想过,当我们逝世时, ...
- KMP,深入讲解next数组的求解(转载)
前言 之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k:但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来翻看算法导 ...
- ubuntu源码安装jdk8
最近学习java,想起来没有在Ubuntu上使用过 因此想安装下环境,并在Ubuntu上试用MPXJ读取mpp文件 1.安装 下载jdk8 https://www.oracle.com/technet ...
- LiDAR、LAS、LAS Dataset与点云
LiDAR Light Detection And Ranging,激光探测及测距,是一种光学遥感技术,使用激光对地球表面的密集采样,产生高精度X.Y.Z测量值. 激光雷达系统的主要硬件组成部分包括一 ...
- Linux常见问题整理
1. 操作系统应该要控制硬件的哪些单元? 运算单元.控制单元.寄存器组.总线接口单元.输入/输出接口单元. 2. 一个较为完整的操作系统应该包含哪些部分? 比较完整的操作系统应该包含两个组件,一个是核 ...
- 【App】不通过App Store实现ios应用分发下载安装(转)
转自:https://www.cnblogs.com/star91/p/5018995.html 最近公司的项目准备着手宣传工作了,宣传手册上要印制App的下载地址二维码,但是客户端应用还未上线, ...
- 3D Slicer Modify Mouse Event 修改3D Slicer中的鼠标响应事件
在3D Slicer中,我们如果想在自己写的插件中来修改默认的鼠标响应事件的话,就需要先将原有的响应事件链接删除,然后建立自定义的响应事件链接,然后将自己要实现的功能写在响应事件函数中. 比如Slic ...