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

缺失type信息时如何将JSON反序列化为Jackson基类?

解决方案

这个问题的核心在于,你配置的@JsonTypeInfo默认要求必须提供type属性来确定具体子类,当缺失这个字段时,Jackson无法推断要实例化的类型,因此抛出反序列化异常。要实现缺失type时自动反序列化为基类Vehicle,只需要在@JsonTypeInfo注解中添加defaultImpl属性即可。

具体修改步骤

修改你的Vehicle类的注解配置,新增defaultImpl = Vehicle.class:

@JsonTypeName("Vehicle") 
@JsonTypeInfo( 
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type",
    defaultImpl = Vehicle.class // 新增这一行,指定默认实现类
) 
@JsonSubTypes({ @Type(value = Car.class), @Type(value = Bicycle.class) }) 
class Vehicle{ 
    int number; 
} 

@JsonTypeName("Car") 
class Car extends Vehicle{ 
    int seatingCapacity; 
} 

@JsonTypeName("Bicycle") 
class Bicycle extends Vehicle{ 
    String handleType; 
} 

原理说明

defaultImpl是Jackson提供的属性,用于指定当类型信息缺失或无法匹配时使用的默认实现类。这里因为你的Vehicle是非抽象类,可以直接实例化,刚好符合需求:

  • 当请求中包含type字段时,Jackson依然会按照原逻辑匹配对应的子类(Car/Bicycle)完成反序列化;
  • 当请求中没有type字段时,Jackson会自动使用Vehicle作为目标类完成反序列化。

测试验证

现在发送你之前的失败请求:

{ "number": "2222" }

Jackson会将其正确反序列化为Vehicle实例,number字段会被正常赋值,不会再抛出反序列化异常。

注意事项

  • 这个方案仅适用于基类为非抽象类的场景,如果你的Vehicle是抽象类,需要另外定义一个可实例化的默认子类作为defaultImpl;
  • Spring Boot 1.5.2.RELEASE依赖的Jackson版本是2.8.x,defaultImpl属性在这个版本已经完全支持,无需担心兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:21:22