Home > Java > javaTutorial > How to Deserialize Polymorphic JSON with Jackson into Polymorphic Types?

How to Deserialize Polymorphic JSON with Jackson into Polymorphic Types?

DDD
Release: 2024-11-12 00:57:02
Original
475 people have browsed it

How to Deserialize Polymorphic JSON with Jackson into Polymorphic Types?

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>)
Copy after login

Triggered by the line:

return mapper.readValue(root, animalClass);
Copy after login

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;
    }
    
}
Copy after login

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;

}
Copy after login

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!

source:php.cn
Statement of this Website
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
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template