Maison  >  Article  >  Java  >  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
Patricia Arquetteoriginal
2024-11-12 07:54:01763parcourir

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);

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;
    }

}

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


}

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);

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!

Déclaration:
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