Home  >  Article  >  Java  >  How to Deserialize JSON with Jackson into Polymorphic Types and Avoid Compile Errors?

How to Deserialize JSON with Jackson into Polymorphic Types and Avoid Compile Errors?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-17 04:39:03315browse

How to Deserialize JSON with Jackson into Polymorphic Types and Avoid Compile Errors?

Deserialize JSON with Jackson into Polymorphic Types: Resolving Compile Error

In attempting to implement polymorphic JSON deserialization using Jackson, users may encounter the compile-time error "The method readValue(JsonParser, Class) in the type ObjectMapper is not applicable for the arguments (ObjectNode, Class)" when calling mapper.readValue(root, animalClass). This error arises from an incompatibility between the provided arguments and the expected type signatures.

To resolve this issue, consider utilizing Jackson's annotation-based approach for polymorphic deserialization. This involves adding @JsonTypeInfo, @JsonSubTypes, and @JsonIgnoreProperties annotations to the abstract Animal class and its subclasses (Dog and Cat). Here's an example:

@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 {

    protected String name;

    // Getters and setters for the name property
}

In the subclasses, you can specify additional properties as needed. For instance, Dog might have a breed property while Cat has a favoriteToy property.

When deserializing JSON into an Animal object, Jackson will use the @type property to determine the specific subclass to instantiate. Here's an example test case:

ObjectMapper objectMapper = new ObjectMapper();

Animal myDog = new Dog("ruffus", "english shepherd");

Animal myCat = new Cat("goya", "mice");

String dogJson = objectMapper.writeValueAsString(myDog);
Animal deserializedDog = objectMapper.readValue(dogJson, Animal.class);

String catJson = objectMapper.writeValueAsString(myCat);
Animal deseriliazedCat = objectMapper.readValue(catJson, Animal.class);

This approach allows for seamless deserialization of polymorphic JSON into its corresponding subclasses, avoiding the compile-time error mentioned earlier.

The above is the detailed content of How to Deserialize JSON with Jackson into Polymorphic Types and Avoid Compile Errors?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn