In an attempt to solve the compilation error while deserializing polymorphic JSON using Jackson's ObjectMapper, the culprit lies in the type mismatch of the readValue() method's parameters.
The problematic line is:
return mapper.readValue(root, animalClass);
The generic readValue() method expects a TypeReference or a Class as the second parameter, but animalClass is an instance of Class
To resolve this error and allow polymorphic deserialization, we can leverage Jackson's JSON annotations. In this approach, the @JsonTypeInfo, @JsonSubTypes, and @JsonIgnoreProperties annotations are employed.
Modify the Animal class and its subclasses as follows:
@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; } }
public class Dog extends Animal { private String breed; public Dog() { } // Constructors and getters/setters omitted for brevity } public class Cat extends Animal { private String favoriteToy; // Constructors and getters/setters omitted for brevity }
With these annotations, Jackson can now properly deserialize the polymorphic JSON data into the appropriate subclasses. The corrected readValue() line would be:
return mapper.readValue(root, Animal.class);
The above is the detailed content of How to Deserialize JSON into Polymorphic Types with Jackson: Resolving the 'Cannot Map Directly' Compilation Error?. For more information, please follow other related articles on the PHP Chinese website!