使用@JsonTypeInfo
和@JsonSubTypes
,可以在没有类型信息的情况下反序列化具体子类的对象吗?
假设我有一个抽象的Animal
类:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Dog.class, name = "Dog"),
@JsonSubTypes.Type(value = Cat.class, name = "Cat")
})
public abstract class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
和一个Dog
子类:
public class Dog extends Animal {
private String breed;
public Dog() {
}
public Dog(String name, String breed) {
setName(name);
setBreed(breed);
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
}
我知道可以基于其父类实例化一个子类对象,如下所示:
{
"type": "Dog",
"name": "Jack",
"breed": "shepherd"
}
Animal deserializedDog = objectMapper.readValue(dogJson, Animal.class);
但是,有时我想直接实例化子类对象,而不使用父类:
{
"name": "Jack",
"breed": "shepherd"
}
Dog deserializedDog = objectMapper.readValue(dogJson, Dog.class);
子类对象将被发送到端点:
@PostMapping("/endpoint")
public ResponseEntity<Dog> sendDataToJms(
@RequestBody Dog request, @RequestHeader Map<String, String> headers) throws Exception {
//...
}
有可能吗?
发布于 2021-03-29 06:05:46
您只需要像这样创建ObjectMapper
:
ObjectMapper objectMapper = new ObjectMapper()
.addHandler(new DeserializationProblemHandler() {
@Override
public JavaType handleMissingTypeId(DeserializationContext ctxt,
JavaType baseType,
TypeIdResolver idResolver,
String failureMsg)
throws IOException {
return baseType;
}
});
https://stackoverflow.com/questions/66848837
复制相似问题