zoukankan      html  css  js  c++  java
  • 通过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>
  • 相关阅读:
    java.lang.UnsupportedOperationException: Not supported by BasicDataSource
    c# seo 百度sitemap书写
    c# 泛型原理(旧)
    apache 服务器配置常用知识点合集
    sass 基本常识
    c# TryParse
    webpack 配置热更新
    c# ref和out 详解
    IIS applicationHost.config 查找历史
    c# webapi 自定义返回数据
  • 原文地址:https://www.cnblogs.com/ccuzhaozhihao/p/6575425.html
Copyright © 2011-2022 走看看