Unable to Deserialize JSON with Jackson into Polymorphic Types
Issue:
Upon attempting to deserialize polymorphic JSON data, an error is encountered at compile time:
The method readValue(JsonParser, Class) in the type ObjectMapper is not applicable for the arguments (ObjectNode, Class<capture#6-of ? extends Animal>)
Triggered by the line:
return mapper.readValue(root, animalClass);
Solution:
To resolve this issue, we can employ annotations to indicate the polymorphic relationship between the base class (Animal) and its subclasses (Dog and Cat). By declaring the @JsonTypeInfo, @JsonSubTypes, and @JsonIgnoreProperties annotations in the Animal class, the ObjectMapper will be informed of the polymorphic nature of your classes.
Annotated Animal Class:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY) @JsonSubTypes({ @JsonSubTypes.Type(value = Dog.class, name = "Dog"), @JsonSubTypes.Type(value = Cat.class, name = "Cat") }) public abstract class Animal { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
Subclass Declarations:
Define the Dog and Cat subclasses as follows:
public class Dog extends Animal { private String breed; public Dog() { } public Dog(String name, String breed) { setName(name); setBreed(breed); } public String getBreed() { return breed; } public void setBreed(String breed) { this.breed = breed; } } public class Cat extends Animal { public String getFavoriteToy() { return favoriteToy; } public Cat() {} public Cat(String name, String favoriteToy) { setName(name); setFavoriteToy(favoriteToy); } public void setFavoriteToy(String favoriteToy) { this.favoriteToy = favoriteToy; } private String favoriteToy; }
This updated approach utilizing annotations will enable seamless serialization and deserialization of polymorphic JSON.
The above is the detailed content of How to Deserialize Polymorphic JSON with Jackson into Polymorphic Types?. For more information, please follow other related articles on the PHP Chinese website!