【发布时间】:2020-06-09 15:04:37
【问题描述】:
我想在 Spring Boot 应用程序中使用 Jackson 来反序列化具有以下属性的 YAML 对象:
- 抽象类
Vehicle,由Boat和Car实现 - 为简单起见,假设两者都有一个名称,但只有
Boat也有一个seaworthy属性,而Car有一个top-speed。
mode-of-transport:
type: boat
name: 'SS Boatface'
seaworthy: true
----
mode-of-transport:
type: car`
name: 'KITT'
top-speed: 123
这一切在我使用 @JsonTypeInfo 和 @JsonSubTypes 的带注释的子类中都可以正常工作!
现在,我想创建一个仅使用 String 值的速记,默认情况下应该使用该名称创建一个 Car:
mode-of-transport: 'KITT'
我尝试创建自己的自定义序列化程序,但在大多数相关细节上陷入困境。如果这是正确的方法,请帮我填写:
public class VehicleDeserializer extends StdDeserializer<Merger> {
/* Constructors here */
@Override
public Vehicle deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
if (/* it is an OBJECT */){
// Use the default polymorphic deserializer
} else if (/* it is a STRING */) {
Car car = new Car();
car.setName( /* the String value */ );
return car;
}
return ???; /* what to return here? */
}
}
我找到了这 2 个答案以获得灵感,但看起来将它与多态类型结合起来会变得更加困难:How do I call the default deserializer from a custom deserializer in Jackson 和 Deserialize to String or Object using Jackson
与这些问题中提供的解决方案有些不同:
- 我正在处理 YAML,而不是 JSON。不确定那里的细微差别。
- 我在反序列化器中对字符串的“默认”类型进行硬编码没有问题,希望它更简单。
【问题讨论】: