Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are @JsonTypeInfo and @JsonSubTypes used for in jackson

What are the @JsonTypeInfo and @JsonSubTypes annotations used for in Jackson?

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

What I understand is that it additionally preserves the concrete type of object being serialised along with the actual data.

What is not clear to me is what is the actual advantage/gain during deserialization.

Not getting any significant documentation apart from the java docs. Can anyone please help out here or provide some docs around the same.

like image 843
Harshit Avatar asked Aug 01 '17 20:08

Harshit


People also ask

What is JsonTypeName?

@JsonTypeName is used to set type names to be used for annotated class.

What is the use of JsonTypeInfo?

@JsonTypeInfo is used to indicate details of type information which is to be included in serialization and de-serialization.

What is the use of @JsonDeserialize?

@JsonDeserialize is used to specify custom deserializer to unmarshall the json object.

What are Jackson annotations?

The Jackson annotation @JsonIgnore is used to tell Jackson to ignore a certain property (field) of a Java object. The property is ignored both when reading JSON into Java objects, and when writing Java objects into JSON.


Video Answer


1 Answers

The purpose of these annotations is to support polymorphism on deserialization. When deserializing the actual code being executed will know the class of what it expects. E.g., the type of some field being deserialized into. But if that class has subclasses (i.e., subtypes) how does the generic Jackson deserializer know which actual class the string being deserialized is? It's got to create an instance of some concrete type (the class or one of its subclasses) and fill it up. The only way it can know which one to create is if that information is written into the serialization in the first place.

As this answer says there are three ways to do it - you pick the one that's appropriate for your use case. @JsonTypeInfo + @JsonSubtypes is one of those ways - it works great when you know, at compile time, all of the possible subtypes that could exist for the class in question.

like image 149
davidbak Avatar answered Sep 20 '22 21:09

davidbak