在jackson中使用@JsonTypeInfo和@JsonSubTypes批注是什么?
public class Lion extends Animal {
private String name;
@JsonCreator
public Lion(@JsonProperty("name") String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getSound() {
return "Roar";
}
public String getType() {
return "carnivorous";
}
public boolean isEndangered() {
return true;
}
@Override
public String toString() {
return "Lion [name=" + name + ", getName()=" + getName() + ", getSound()=" + getSound() + ", getType()=" + getType() + ", isEndangered()="
+ isEndangered() + "]";
}
}
=======================================
public class Elephant extends Animal {
@JsonProperty
private String name;
@JsonCreator
public Elephant(@JsonProperty("name") String name) {
this.name = name;
}
public String getName() {
return name;
}
public String getSound() {
return "trumpet";
}
public String getType() {
return "herbivorous";
}
public boolean isEndangered() {
return false;
}
@Override
public String toString() {
return "Elephant [name=" + name + ", getName()=" + getName() + ", getSound()=" + getSound() + ", getType()=" + getType()
+ ", isEndangered()=" + isEndangered() + "]";
}
}
=============================================
@JsonTypeInfo (use = JsonTypeInfo.Id.CLASS, include = As.PROPERTY, property = "classNameExtenral")
@JsonSubTypes ({@Type (value = Lion.class, name = "lion"), @Type (value = Elephant.class, name = "elephant")})
public abstract class Animal {
@JsonProperty ("name")
String name;
@JsonProperty ("sound")
String sound;
@JsonProperty ("type")
String type;
@JsonProperty ("endangered")
boolean endangered;
}
public static void main(String[] args){
Lion lion = new Lion("Simba");
Elephant elephant = new Elephant("Manny");
List<Animal> animals = new ArrayList<>();
animals.add(lion);
animals.add(elephant);
}
我了解的是,它另外保留了要序列化的对象的具体类型以及实际数据。
我不清楚是反序列化期间的实际优势/ yield 是什么。
除了Java文档外,没有获得任何重要的文档。任何人都可以在这里提供帮助或提供一些文档吗?
最佳答案
这些注释的目的是支持反序列化上的多态性。反序列化时,正在执行的实际代码将知道所期望的类。例如,反序列化为某些字段的类型。但是,如果该类具有子类(即子类型),那么泛型Jackson串化器如何知道要反串化的字符串是哪个实际类?必须创建一个具体类型的实例(该类或其子类之一)并填充它。它知道创建哪个唯一的方法是,首先是否将该信息写入序列化中。
正如this answer所说,有三种方法可以做到-选择适合您的用例的方法。 @JsonTypeInfo
+ @JsonSubtypes
是这些方法之一-当您在编译时知道所讨论的类可能存在的所有可能的子类型时,它就非常有用。