java - 什么是 @JsonTypeInfo 和 @JsonSubTypes 在 jackson 中的用途

标签 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;
}

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 是其中一种方法 - 当您在编译时知道所讨论的类可能存在的所有可能子类型时,它会很好用。

关于java - 什么是 @JsonTypeInfo 和 @JsonSubTypes 在 jackson 中的用途,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447276/

相关文章:

java - Jackson - 仅覆盖特定字段的自定义序列化程序

java - 如何使用 Kyro 序列化 Exception 对象?

java - JSON/Jackson 输出在每个节点上意外添加 "parent"元素

java - 内部类对象

java - Spring MVC 在一个请求中返回多个对象

PHP 写入 mysql 后出现反序列化错误,这会截断我的数据

java - 将 JSON 字符串转换为具有自定义类型的 Map

java - 使用面向对象 Java 时遇到一些问题,这是对的吗?

java - codingbat 递归练习

java - 带有 jackson 注释的 AWS Lambda json 反序列化