杰克逊中使用的@JsonTypeInfo和@JsonSubTypes是什么

在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);

}

,它还保留了要序列化的对象的具体类型以及实际数据。

反序列化期间的实际优势/收益是什么。

除了Java文档外,没有获得任何重要的文档。任何人都可以在这里提供帮助或提供一些文档吗?

回答:

这些注释的目的是支持反序列化上的 多态性 。反序列化时,正在执行的实际代码将知道所期望的

。例如,反序列化为某些字段的类型。但是,如果该类具有子类(即子类型),那么泛型Jackson解串器如何知道要反序列化的字符串是哪个实际类?必须创建一个具体类型的实例(该类或其子类之一)并填充它。它知道创建哪个唯一的方法是,首先是否将该信息

写入 序列化中。

就像这个答案所说的,有三种方法可以做到-

选择适合您的用例的方法。 @JsonTypeInfo+ @JsonSubtypes是其中一种方法-

当您在编译时知道所讨论的类可能存在的所有可能的子类型时,它非常有用。

以上是 杰克逊中使用的@JsonTypeInfo和@JsonSubTypes是什么 的全部内容, 来源链接: utcz.com/qa/419134.html

回到顶部