You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java使用Gson和Guava对比JSON时提示cannot resolve symbol 'Maps'如何解决

问题解决方案

一、cannot resolve symbol 'Maps' 报错修复步骤

  • 首先删除你放到IntelliJ安装目录lib文件夹下的Guava jar包,该目录是IDE自身运行的依赖目录,不会被项目加载,所有项目依赖统一通过Maven管理即可。
  • 检查代码头部是否添加了正确的Guava Maps导入语句:
    import com.google.common.collect.Maps;
    
  • 修正代码写法错误:Guava Maps类的差异对比方法是静态小写的difference(),且返回值类型是Maps.Difference<K,V>,不是普通Map,修正后的完整代码如下:
    import com.google.common.collect.Maps;
    import com.google.gson.Gson;
    import com.google.gson.JsonElement;
    import com.google.gson.reflect.TypeToken;
    import java.lang.reflect.Type;
    import java.util.Map;
    
    public static Maps.Difference<String, Object> newCompare(JsonElement original, JsonElement output){
        // 注意gson实例建议抽取为全局单例,此处仅做示例
        Gson gson = new Gson();
        Type type = new TypeToken<Map<String, Object>>(){}.getType();
        Map<String, Object> leftMap = gson.fromJson(original, type);
        Map<String, Object> rightMap = gson.fromJson(output, type);
        return Maps.difference(leftMap, rightMap);
    }
    
  • 若Maven依赖仍未生效,可执行mvn clean install -U强制更新依赖,再在IntelliJ中右键Maven项目选择重新加载即可。

拿到Maps.Difference实例后可以直接调用内置方法获取不同维度的差异:

  • entriesOnlyOnLeft():仅在原始JSON中存在的键值对
  • entriesOnlyOnRight():仅在待对比JSON中存在的键值对
  • entriesDiffering():两边都存在但值不相等的键值对
  • entriesInCommon():两边完全一致的键值对

二、其他JSON差异对比实现方案

如果需要更灵活的对比规则,可选择以下成熟方案:

  • 方案1:使用JSONAssert库,专门面向JSON对比场景,支持自定义严格程度(是否忽略顺序、是否忽略额外字段等),依赖配置如下:
    <dependency>
        <groupId>org.skyscreamer</groupId>
        <artifactId>jsonassert</artifactId>
        <version>1.5.1</version>
    </dependency>
    
  • 方案2:使用Jackson库的树模型递归对比,直接遍历JsonNode节点,支持自定义嵌套对象、数组的对比规则,适合需要自定义差异输出格式的场景。
  • 方案3:自研递归遍历Gson JsonElement的逻辑,针对性处理字符串、数值、布尔、数组、嵌套对象等不同类型的JSON节点,可完全自定义对比逻辑。

内容的提问来源于stack exchange,提问作者timotej97

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:06:06