Maison > Java > javaDidacticiel > Comment désérialiser JSON en types polymorphes avec Jackson : résoudre l'erreur de compilation « Impossible de mapper directement » ?

Comment désérialiser JSON en types polymorphes avec Jackson : résoudre l'erreur de compilation « Impossible de mapper directement » ?

Patricia Arquette
Libérer: 2024-11-12 07:54:01
original
807 Les gens l'ont consulté

How to Deserialize JSON into Polymorphic Types with Jackson: Resolving the

Désérialiser JSON en types polymorphes avec Jackson : résoudre l'erreur de compilation

Dans une tentative de résoudre l'erreur de compilation lors de la désérialisation de JSON polymorphe à l'aide de l'ObjectMapper de Jackson, le coupable réside dans l'incompatibilité de type des paramètres de la méthode readValue().

La ligne problématique est :

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

La méthode générique readValue() attend un TypeReference ou une Class comme deuxième paramètre, mais animalClass est une instance de Class, que le compilateur ne peut pas mapper directement.

Solution utilisant les annotations :

Pour résoudre cette erreur et permettre la désérialisation polymorphe, nous pouvons exploiter les annotations JSON de Jackson. Dans cette approche, les annotations @JsonTypeInfo, @JsonSubTypes et @JsonIgnoreProperties sont utilisées.

Modifiez la classe Animal et ses sous-classes comme suit :

Classe Animal :

@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

Sous-classes de chiens et de chats :

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


}
Copier après la connexion

Avec ces annotations, Jackson peut désormais désérialiser correctement les données JSON polymorphes dans les sous-classes appropriées. La ligne readValue() corrigée serait :

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

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal