Java @JsonTypeInfo和@JsonSubTypes在jackson中用于什么

Java @JsonTypeInfo和@JsonSubTypes在jackson中用于什么,java,serialization,jackson,deserialization,Java,Serialization,Jackson,Deserialization,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; } publi

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);
}
==============================================

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);
}
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS,include=As.PROPERTY,PROPERTY=“classnameenteral”)
@JsonSubTypes({@Type(value=Lion.class,name=“Lion”),@Type(value=Elephant.class,name=“Elephant”)})
公共抽象类动物{
@JsonProperty(“名称”)
字符串名;
@JsonProperty(“声音”)
弦乐;
@JsonProperty(“类型”)
字符串类型;
@JsonProperty(“濒危”)
布尔濒危;
}
公共静态void main(字符串[]args){
狮子=新狮子(“辛巴”);
大象=新象(“曼尼”);
列出动物=新建ArrayList();
动物。添加(狮子);
动物。加上(大象);
}
我的理解是它还保留了与实际数据一起序列化的对象的具体类型

我不清楚的是反序列化过程中的实际优势/收益是什么


除了java文档之外,没有任何重要的文档。任何人都可以在此提供帮助或提供一些相关文档。

这些注释的目的是支持反序列化的多态性。当反序列化正在执行的实际代码时,将知道它所期望的类。例如,反序列化到的某个字段的类型。但是,如果该类有子类(即子类型),那么泛型Jackson反序列化器如何知道要反序列化的字符串是哪个实际类?它必须创建一个具体类型的实例(类或其子类之一)并填充它。它知道要创建哪一个的唯一方法是首先将该信息写入序列化中


如前所述,有三种方法可以做到这一点——您选择适合您的用例的方法
@JsonTypeInfo
+
@JsonSubtypes
就是其中的一种方法——当您在编译时知道所讨论的类可能存在的所有可能的子类型时,它非常有用。

也许这个答案会有帮助:它有帮助。。谢谢。在单个具体类上使用@JsonTypeInfo不是更有意义吗?我认为,在接口上使用它似乎违反了开闭原则(因为我们需要在每一个新添加的具体实现上修改我们的接口)。如果我在这里又遗漏了什么,请纠正我,这取决于用例。例如,我有一个用例,实际上我可以在一个地方使用@JsonSubtypes,这比标记每个子类型更好。但我忘了那个用例是什么;我记得这有点不同寻常。但它更多地涉及实际的部署/发布问题,而不是纯粹的O-O理论。(请记住:任何“原则”如“开-关”都只是一个强有力的指导原则……在某些情况下,您可能会发现违反此原则就是正确的设计——只需确保您确实知道原因。)假设您有一个包含Animal类型字段的类框架。当Cage对象从JSON反序列化时,Jackson发现它应该创建一个动物,因此如果动物没有用@JsonTypeInfo注释,Jackson将不会应用多态性支持,因此它将只创建动物(如果可能)而不是其子类型。