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
相关产品推荐
相关产品推荐

