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

