首先,我们举个例子来对两个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格式是否相同的更多相关文章

  1. 数据库获取map数据后转化成json格式的数据

    一,从数据库查出来的数据 两张表先各自左外连接,然后在相互左外连接查找省市县的数据(业务需求必须这样做,省市去的是第一张表,而市县取的是第二张表,两张表中间通过市的名字连接)见这个博文的最后一张图片 ...

  2. 将List<Map>中的datas转换为json格式写入文件

    private static boolean writeToTextFileByJson(List<Map<String, Object>> datas, String tit ...

  3. JSON(四)——异步请求中前后端使用Json格式的数据进行交互

    json格式的数据广泛应用于异步请求中前后端的数据交互,本文主要介绍几种使用场景和使用方法. 一,json格式字符串 <input type="button" id=&quo ...

  4. 我的Android进阶之旅------>android如何将List请求参数列表转换为json格式

    本文同步发表在简书,链接:http://www.jianshu.com/p/395a4c8b05b9 前言 由于接收原来的老项目并进行维护,之前的http请求是使用Apache Jakarta Com ...

  5. Java中将JSON格式的数据转换成对应的Bean、Map、List数据

    简单说明: 为了方便数据在客户端及服务器端的传输,有时候我们会用一些比较方便组织的数据类型,比如json.xml等传给客户端,客户端也可以重新组织数据传回服务器端.JSON和XML提供了一套比较方便的 ...

  6. json格式转换成Map的应用

    jsp 1.引用json.js(将json格式转换成字符串) 2. var name = document.getElementById("name").value; var re ...

  7. JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面

    将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...

  8. 转!!JavaBean,List,Map转成json格式

    public class User { private String username; private String password; public String getUsername() { ...

  9. 在PHP代码中处理JSON 格式的字符串的两种方法:

    总结: 在PHP代码中处理JSON 格式的字符串的两种方法: 方法一: $json= '[{"id":"1","name":"\u ...

随机推荐

  1. 【G】开源的分布式部署解决方案 - 预告篇

    为什么想到要做分布式部署解决方案? 当项目越做越大以后,你会发现部署变成一件极其头疼的事情.当然头疼的绝不仅仅在部署一个环节,比如新服务器环境搭建当中就许多坑要踩.各种重复性的工作,包括但不仅限于增加 ...

  2. iOS 图片压缩方法

    iOS 图片压缩方法 两种图片压缩方法 两种压缩图片的方法:压缩图片质量(Quality),压缩图片尺寸(Size). 压缩图片质量 NSData *data = UIImageJPEGReprese ...

  3. I/O模型浅析

    引入 首先来说一下进程: 进程在就是一段执行中的代码,他是由一条条指令和数据组成的一个具有生命周期的有头有尾的实体. 进程根据权限大体上可以分为两类:用户进程 和 内核进程. 这两者的主要区别在于权限 ...

  4. Tomcat的安装配置与JavaWeb入门教程

    本文开发环境: windos7 , Eclipse-mars , JDK1.7 , Tomcat7.0 1.关于Tomcat 先来看一段Tomcat的介绍: Tomcat是Apache 软件基金会(A ...

  5. 成小胖学习ActiveMQ·基础篇

    过了个春节,回到公司的成小胖变成了成大胖.但是你们千万别以为他那个大肚子里面装的都是肥肉,里面的墨水也多了不少嘞,毕竟成小胖利用春节的半个月时间专心学习并研究了 ActiveMQ,嘿嘿……这不,为了检 ...

  6. 报表学习总结(一)——ASP.NET 水晶报表(Crystal Reports)的简单使用

    一.水晶报表简介 Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表.水晶报表是业内最专业.功能最强的报表系统,它除了强大的报表功能外.最大的优势是实现了与绝 ...

  7. java线程并发控制:ReentrantLock Condition使用详解

    本文摘自:http://outofmemory.cn/java/java.util.concurrent/lock-reentrantlock-condition java的java.util.con ...

  8. Google Guice学习

    学习动力:公司项目使用 官方文档:https://github.com/google/guice/wiki/Motivation 学习阶段:入门 主要部份: 简介 Bindings方式 Scopes设 ...

  9. Xcode插件失效解决办法

    升级完Xcode突然间发现之前安装的所有插件都不生效了,费了九牛二虎之力找到了解决办法...      1.打开终端,输入以下代码获取到DVTPlugInCompatibilityUUID       ...

  10. nodejs爬虫——汽车之家所有车型数据

    应用介绍 项目Github地址:https://github.com/iNuanfeng/node-spider/ nodejs爬虫,爬取汽车之家(http://www.autohome.com.cn ...