通过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 ...
随机推荐
- JSON在线解析,新版本JSON在线解析
SOJSON,出了新版本的JSON在线解析,真的很好用,可以上下版本.左右版本.效果图如下.它的网址是:http://www.sojson.com/simple_json.html SOJSON集成了 ...
- HDU5477(模拟)
A Sweet Journey Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- com.atomikos.icatch.HeurHazardException: Heuristic Exception
com.atomikos.icatch.HeurHazardException: Heuristic Exception: 删除Tomcat bin文件夹下的spring.loglog4j.appe ...
- 在点击div中的p时,如何阻止事件冒泡?
今天整理笔记,发现在学习javaScript的过程中,遇到过一个在当时看来很棘手的问题,现在特地总结一下,也希望能帮助到曾像我一样迷惘的初学者. 我还是以一个案例来说明问题,html代码如下: < ...
- C++编程练习(1)----“实现简单的线性表的顺序存储结构“
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素. 故可以用数组来实现顺序存储结构. 用C++编写的利用数组实现简单的读取.插入和删除功能的线性表. #include< ...
- 【前端】:HTML
前言: 最近开始学前端了,这篇博客主要介绍html的一些主要标签,写完这篇博客,我会用刚学的html做一个简单的登陆界面~~ 一.HTML介绍 HTML(Hyper Text Mark-up Lang ...
- php curl详细解析和常见大坑
1. 拿来先试试手 比如我们以著名的"测试网络是否连接"的网站--百度为例,来尝试下curl <?php // create curl resource $ch = curl ...
- CSS3高级选择器
CSS3中添加了一些新的选择器 与之前的不同 这些选择器有些类似于jquery的选择器 能够让我们更高的操作DOM 废话不多说 为了更直观的了解 我们以这段为实例 来进行操作 <!DOCTYPE ...
- Javascript面对对象. 第二篇
但是还有一个问题,就是识别的问题,因为根本无法搞清楚他们到底是哪个对象的实例. 1.构造函数 function CreateObject(name,age){ //创建一个对象,使用构造函数的对象都是 ...
- 查看hive中某个表中的数据、表结构及所在路径
查看hive中action_data_myisam表中的数据.表结构及所在路径 1.客户端进入hive环境:hive 2.查看表数据,鉴于数据量大,这里只显示前五条:select * from act ...