Для чего используются @JsonTypeInfo и @JsonSubTypes в Джексоне

что используют аннотации @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. Может any1 пожалуйста, помогите здесь или предоставьте некоторые документы примерно так же.

1 ответов


целью этих аннотаций является поддержка полиморфизм при десериализации. При десериализации фактического выполняемого кода будет знать класс на что он рассчитывает. Например, тип некоторого поля, в которое десериализуется. Но если этот класс имеет подклассы (т. е. подтипы), как общий десериализатор Джексона знает, какой фактический класс является десериализуемой строкой? Он должен создать экземпляр некоторого конкретного типа (класс или один из его подклассы) и заполнить его. Единственный способ узнать, какой из них создать, - это если эта информация написано в сериализацию в первую очередь.

As ответ говорит, что есть три способа сделать это - вы выбираете подходящую для вашего случая. @JsonTypeInfo + @JsonSubtypes один из таких способов - это работает отлично, когда вы знаете, во время компиляции, все возможные подтипы, которые могут существовать для данного класса.