Maison > Java > javaDidacticiel > le corps du texte

Comment désérialiser JSON avec Jackson en types polymorphes et éviter les erreurs de compilation ?

Mary-Kate Olsen
Libérer: 2024-11-17 04:39:03
original
312 Les gens l'ont consulté

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

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

En tentant d'implémenter la désérialisation JSON polymorphe à l'aide de Jackson, les utilisateurs peuvent rencontrer le problème de compilation -time erreur "La méthode readValue(JsonParser, Class) dans le type ObjectMapper n'est pas applicable pour les arguments (ObjectNode, Class)" lors de l'appel de mapper.readValue(root, animalClass). Cette erreur résulte d'une incompatibilité entre les arguments fournis et les signatures de type attendues.

Pour résoudre ce problème, envisagez d'utiliser l'approche basée sur les annotations de Jackson pour la désérialisation polymorphe. Cela implique l'ajout des annotations @JsonTypeInfo, @JsonSubTypes et @JsonIgnoreProperties à la classe abstraite Animal et à ses sous-classes (Dog et Cat). Voici un exemple :

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

Dans les sous-classes, vous pouvez spécifier des propriétés supplémentaires si nécessaire. Par exemple, Dog peut avoir une propriétébreed tandis que Cat a une propriété favoriteToy.

Lors de la désérialisation de JSON en un objet Animal, Jackson utilisera la propriété @type pour déterminer la sous-classe spécifique à instancier. Voici un exemple de cas de test :

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

Cette approche permet une désérialisation transparente du JSON polymorphe dans ses sous-classes correspondantes, évitant ainsi l'erreur de compilation mentionnée précédemment.

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