什么是@JsonTypeInfo和@JsonSubTypes用于jackson

时间:2017-08-01 20:38:03

标签: java serialization jackson deserialization

在jackson中使用for的@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() + "]";
}
}

============================================== < / p>

@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文档之外,没有任何重要文档。任何人都可以在这里帮忙或提供一些相同的文档。

1 个答案:

答案 0 :(得分:21)

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

正如this answer所说,有三种方法可以做到 - 您选择适合您用例的方法。 @JsonTypeInfo + @JsonSubtypes是其中一种方式 - 当您在编译时知道所讨论的类可能存在的所有可能的子类型时,它会很有效。