通过Map间接比较两个Json格式是否相同
首先,我们举个例子来对两个Json格式进行比较
第一个Json格式:
{"singleway":[],"multiway":{"channelSlave":[{"name":"aa1","channel0name":"dd1","id":"1111111113"},{"name":"aa2","channel0name":"dd1","id":"1111111112"}],"channelMaster":{"name":"aa","channel0name":"dd","id":"1111111111"}}}
第二Json格式:
{"singleway":[],"multiway":{"channelSlave":[{"name":"aa2","channel0name":"dd1","id":"1111111112"},{"name":"aa1","channel0name":"dd1","id":"1111111113"}],"channelMaster":{"name":"bb","channel0name":"dd","id":"1111111111"}}}
由此我们可以看到,两个Json格式的不同点在于 channelSlave作为key的值中,两个{} 内的顺序是不同的,channelMaster中的name字段的值是不同的。
此时我们来对两个Json格式进行比较,规则为:channelSlave中的值不同,我们可以看做是不影响整体的内容,则可认为是等价的,channelMaster中的name字段值不同,则
两个Json为不同。
首先我们队这个Json格式进行转化,转化为Map<String,Object> Object = List<Object> or Map<String,Object>
代码如下:
1、定义静态工具类 ,解析Json格式数据为指定类型
public static <T> T readJsonToObject(String jsonString, TypeReference<T> tr) {
ObjectMapper objectMapper = new ObjectMapper();
if (jsonString == null || "".equals(jsonString)) {
return null;
} else {
try {
return (T) objectMapper.readValue(jsonString, tr);
} catch (Exception e) {
logger.debug("json error:" + e);
}
}
return null;
}
2、调用工具类,对Json进行解析,解析为Map<String,Object>格式数据
String jsonData = "{\"singleway\":[],\"multiway\":{\"channelSlave\":[{\"name\":\"aa1\",\"channel0name\":\"dd1\",\"id\":\"1111111113\"},{\"name\":\"aa1\",\"channel0name\":\"dd1\",\"id\":\"1111111112\"}],\"channelMaster\":{\"name\":\"aa\",\"channel0name\":\"dd\",\"id\":\"1111111111\"}}}";
Map<String, Object> requestMap = JsonUtils.readJsonToObject(jsonData, new TypeReference<Map<String, Object>>() {
}); 3、定义Map比较的工具类,通过google的guava表达是中的 Maps.difference(map1,map2)方法进行比较,单此方法可比较正常的Map和String内容,对于List方式的比较,同时进行了数值和list内容顺序的比较,显然不符合我们的匹配规则,所以我们要对这个方法配合List的containAll方法进一步做封装。代码如下:
public static boolean compareMap(Map<String, Object> leftMap, Map<String, Object> rightMap) {
MapDifference<String, Object> difference = Maps.difference(leftMap, rightMap);
//获取所有不同点
Map<String, MapDifference.ValueDifference<Object>> differenceMap = difference.entriesDiffering();
Iterator diffIterator = differenceMap.entrySet().iterator();
if (diffIterator.hasNext()) {
Map.Entry entry = (java.util.Map.Entry) diffIterator.next();
MapDifference.ValueDifference<Object> valueDifference = (MapDifference.ValueDifference<Object>) entry.getValue();
System.out.println("left: " + valueDifference.leftValue());
System.out.println("right: " + valueDifference.rightValue());
//处理结果是否为map,则递归执行比较规则
if (valueDifference.leftValue() instanceof Map && valueDifference.rightValue() instanceof Map) {
boolean equal = compareMap((Map<String, Object>) valueDifference.leftValue(), (Map<String, Object>) valueDifference.rightValue());
if (!equal) {
return false;
}
}
//如果处理结果为list,则通过list方式处理 - 若list中值相同,但是顺序不同,则认为两个list相同
if (valueDifference.leftValue() instanceof List && valueDifference.rightValue() instanceof List) {
boolean equal = ((List) valueDifference.leftValue()).containsAll((List) valueDifference.rightValue());
if (!equal) {
return false;
}
}
//如果处理最终结果为字符串,则停止比较
if (valueDifference.leftValue() instanceof String && valueDifference.rightValue() instanceof String){
return false;
}
}
//若B中有A中不存在的值,则认为不同
Map<String, Object> onlyOnRightMap = difference.entriesOnlyOnRight();
if (onlyOnRightMap != null && !onlyOnRightMap.isEmpty()){
return false;
}
return true;
}
由此可间接性的比较两个Json的一致性。 代码中需要引入Jar包,本实例通过maven构建,则地址如下:
<properties>
<jackson.version>2.7.2</jackson.version>
</properties>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency> <dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
通过Map间接比较两个Json格式是否相同的更多相关文章
- 数据库获取map数据后转化成json格式的数据
一,从数据库查出来的数据 两张表先各自左外连接,然后在相互左外连接查找省市县的数据(业务需求必须这样做,省市去的是第一张表,而市县取的是第二张表,两张表中间通过市的名字连接)见这个博文的最后一张图片 ...
- 将List<Map>中的datas转换为json格式写入文件
private static boolean writeToTextFileByJson(List<Map<String, Object>> datas, String tit ...
- JSON(四)——异步请求中前后端使用Json格式的数据进行交互
json格式的数据广泛应用于异步请求中前后端的数据交互,本文主要介绍几种使用场景和使用方法. 一,json格式字符串 <input type="button" id=&quo ...
- 我的Android进阶之旅------>android如何将List请求参数列表转换为json格式
本文同步发表在简书,链接:http://www.jianshu.com/p/395a4c8b05b9 前言 由于接收原来的老项目并进行维护,之前的http请求是使用Apache Jakarta Com ...
- Java中将JSON格式的数据转换成对应的Bean、Map、List数据
简单说明: 为了方便数据在客户端及服务器端的传输,有时候我们会用一些比较方便组织的数据类型,比如json.xml等传给客户端,客户端也可以重新组织数据传回服务器端.JSON和XML提供了一套比较方便的 ...
- json格式转换成Map的应用
jsp 1.引用json.js(将json格式转换成字符串) 2. var name = document.getElementById("name").value; var re ...
- JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面
将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...
- 转!!JavaBean,List,Map转成json格式
public class User { private String username; private String password; public String getUsername() { ...
- 在PHP代码中处理JSON 格式的字符串的两种方法:
总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...
随机推荐
- 创建 vxlan 并部署 instance - 每天5分钟玩转 OpenStack(147)
上一节我们完成了 OVS VxLAN 的配置工作,今天创建 vxlan100_net 并部署 instance. 创建 vxlan100_net 打开菜单 Admin -> Networks,点 ...
- JAVA_file(1)
1.基本概念的理解 绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz est.txt 代表了test.txt文件的绝对路径.http://www.s ...
- Azure机器学习入门(三)创建Azure机器学习实验
在此动手实践中,我们将在Azure机器学习Studio中一步步地开发预测分析模型,首先我们从UCI机器学习库的链接下载普查收入数据集的样本并开始动手实践: http://archive.ics.uci ...
- 剑指offer编程题Java实现——二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 下面是我实现的代码 ...
- java学习之路
先来说一说我和it之间的不解之缘.准确来说,我接触it是从大二是我买的第一个手机开始的(国产的,展讯平台,能够运行mrp虚拟机),那时候还没有智能手机,或者说还不够普及,总之就是买不起.一次偶然的机会 ...
- 一次MySQL死锁问题解决
一次MySQL死锁问题解决 一.环境 CentOS, MySQL 5.6.21-70, JPA 问题场景:系统有定时批量更新数据状态操作,每次更新上千条记录,表中总记录数约为500W左右. 二.错误日 ...
- 打造“黑客“手机--Kali Nethunter
从三月份开始,继续更新技术文章.一个月没有更新技术文章了,这一个月有一部分时间是在休息,另一部分时间是在学习汇编和操作系统,沉淀底层和逆向方面的技术. 今年年初,为了玩一下 kali NetHunte ...
- java中 i = i++ 的结果
昨天看到下面这段代码,分享出来给大家看看,大家也可以讨论讨论. int i = 0; i = i++; System.out.println("i的值是 "+i); 根据我们通常所 ...
- 关于hession 随笔
今天遇到一个问题,纠结了很久也没有解决,情况是这样的, 我这个项目使用的是 hession 通信.我做的业务很简单,只是新加了一个接口 ,这 个接口是广告那一块的,数据库在之前的项目里面都没有使用到 ...
- Html<img>标签特写 2017-03-10 AM
1.插入图片 <img src="picture1.gif" width="300" height="100" title=" ...