Jackson 2.15无法反序列化泛型内List类型的问题求助
Jackson 2.15泛型类内List类型序列化/反序列化问题解决思路
1. 适配Jackson 2.15的类型序列化策略变更
Jackson 2.14到2.15版本中,泛型容器内元素的类型信息生成逻辑有调整。可以显式配置ObjectMapper的默认类型推导规则,确保容器元素的@class属性被序列化:
ObjectMapper mapper = new ObjectMapper(); // 为非final类启用默认类型推导,以PROPERTY形式输出类型信息 mapper.activateDefaultTyping( mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY );
2. 显式指定泛型类型引用
序列化/反序列化时,通过TypeReference明确泛型结构,避免Jackson自动推断时丢失类型信息:
- 序列化时强制指定类型:
String json = mapper.writerFor(new TypeReference<UserMessageResult<List<AnEntity>>>() {}) .writeValueAsString(userMessageResult);
- 反序列化时指定类型:
UserMessageResult<List<AnEntity>> result = mapper.readValue( jsonStr, new TypeReference<UserMessageResult<List<AnEntity>>>() {} );
3. 补充@JsonSubTypes明确子类映射
在UserMessageResult的entity字段上添加@JsonSubTypes注解,显式声明可序列化的子类类型,让Jackson明确列表元素的类型:
public class UserMessageResult<T> { @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY) @JsonSubTypes({@JsonSubTypes.Type(value = AnEntity.class)}) private T entity; // getter/setter }
4. 升级到Jackson 2.15后续补丁版本
该问题大概率是Jackson 2.15正式版的兼容性bug,后续小版本(如2.15.1、2.15.2)已修复类似泛型容器类型信息丢失问题,直接升级版本可解决。
5. 自定义序列化器兜底
如果以上方法无效,可针对List类型自定义序列化器,强制写入元素的类型信息:
public class TypedListSerializer extends StdSerializer<List<?>> { public TypedListSerializer() { super(List.class); } @Override public void serialize(List<?> value, JsonGenerator gen, SerializerProvider provider) throws IOException { gen.writeStartArray(); for (Object item : value) { // 强制按带类型信息的方式序列化每个元素 provider.findTypedValueSerializer(item.getClass(), true, null) .serialize(item, gen, provider); } gen.writeEndArray(); } }
在UserMessageResult的entity字段上添加注解关联序列化器:
@JsonSerialize(using = TypedListSerializer.class) private T entity;
内容的提问来源于stack exchange,提问作者BetaRide
相关产品推荐
相关产品推荐

