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

如何配置Jackson通过@class字段反序列化Guava Multimap?

解决Jackson反序列化Object类型属性时利用@class字段匹配正确序列化器的问题

核心思路

要让Jackson识别@class字段并以此确定Object类型属性的实际类型,需要两步配置:

  1. 启用Jackson的多态类型解析,指定@class作为类型标识字段;
  2. 引入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:10:08