Maison > Java > javaDidacticiel > Comment désérialiser du JSON polymorphe avec Jackson en types polymorphes ?

Comment désérialiser du JSON polymorphe avec Jackson en types polymorphes ?

DDD
Libérer: 2024-11-12 00:57:02
original
477 Les gens l'ont consulté

How to Deserialize Polymorphic JSON with Jackson into Polymorphic Types?

Impossible de désérialiser JSON avec Jackson en types polymorphes

Problème :

Lors de la tentative de désérialiser les données JSON polymorphes, une erreur est rencontrée au moment de la compilation :

The method readValue(JsonParser, Class) in the type ObjectMapper is not applicable for the arguments (ObjectNode, Class<capture#6-of ? extends Animal>)
Copier après la connexion

Déclenchée par la ligne :

return mapper.readValue(root, animalClass);
Copier après la connexion

Solution :

Pour résoudre ce problème, nous pouvons utiliser des annotations pour indiquer la relation polymorphe entre la classe de base (Animal) et ses sous-classes (Chien et Chat). En déclarant les annotations @JsonTypeInfo, @JsonSubTypes et @JsonIgnoreProperties dans la classe Animal, l'ObjectMapper sera informé de la nature polymorphe de vos classes.

Classe Animal annotée :

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;
    }
    
}
Copier après la connexion

Déclarations de sous-classes :

Définissez les sous-classes Chien et Chat comme suit :

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;

}
Copier après la connexion

Cette approche mise à jour utilisant des annotations permettra une sérialisation et une désérialisation transparentes de JSON polymorphe.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal