如何配置Jackson通过@class字段反序列化Guava Multimap?
解决Jackson反序列化Object类型属性时利用@class字段匹配正确序列化器的问题
核心思路
要让Jackson识别@class字段并以此确定Object类型属性的实际类型,需要两步配置:
- 启用Jackson的多态类型解析,指定
@class作为类型标识字段; - 引入Guava类型支持模块,让Jackson能处理
ArrayListMultimap这类Guava集合。
具体实现方式
方式一:字段级注解(精准控制)
直接在A类的aProperty字段上添加@JsonTypeInfo注解,明确指定通过@class字段识别类型:
import com.fasterxml.jackson.annotation.JsonTypeInfo; class A { @JsonTypeInfo( use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class" ) Object aProperty; }
然后配置ObjectMapper时,注册Guava模块即可:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.guava.GuavaModule; ObjectMapper mapper = new ObjectMapper(); // 注册Guava模块,提供Multimap等类型的序列化/反序列化支持 mapper.registerModule(new GuavaModule());
方式二:全局配置(批量生效)
如果需要让所有Object类型属性都通过@class识别类型,可以全局配置ObjectMapper:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.DefaultTypeResolverBuilder; import com.fasterxml.jackson.databind.jsontype.DefaultTyping; import com.fasterxml.jackson.databind.jsontype.impl.ClassNameIdResolver; import com.fasterxml.jackson.datatype.guava.GuavaModule; ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new GuavaModule()); // 启用默认类型解析,针对非final类型生效 mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); // 修改类型标识字段为@class mapper.setDefaultTyping(new DefaultTypeResolverBuilder(DefaultTyping.NON_FINAL) { @Override protected TypeIdResolver idResolver(MapperConfig<?> config, JavaType baseType, Collection<TypeResolverBuilder<?>> subResolvers, boolean forSer, boolean forDeser) { TypeIdResolver resolver = super.idResolver(config, baseType, subResolvers, forSer, forDeser); if (resolver instanceof ClassNameIdResolver) { ((ClassNameIdResolver) resolver).setTypeIdPropertyName("@class"); } return resolver; } });
依赖说明
确保项目中引入Jackson的Guava类型支持依赖(以Maven为例):
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-guava</artifactId> <version>你的Jackson版本号</version> </dependency>
验证
使用配置好的ObjectMapper反序列化目标JSON字符串,即可得到正确的A实例,其中aProperty会被解析为ArrayListMultimap类型,内部的键值对也能正确映射。
内容的提问来源于stack exchange,提问作者user2115763
相关产品推荐
相关产品推荐

