Maison > Java > javaDidacticiel > Comment désérialiser du JSON polymorphe à l'aide de l'ObjectMapper de Jackson sans erreurs de compilation ?

Comment désérialiser du JSON polymorphe à l'aide de l'ObjectMapper de Jackson sans erreurs de compilation ?

Mary-Kate Olsen
Libérer: 2024-11-24 16:36:11
original
811 Les gens l'ont consulté

How to Deserialize Polymorphic JSON Using Jackson's ObjectMapper without Compilation Errors?

Jackson et JSON polymorphe : résolution des erreurs de compilation pour la désérialisation des nœuds d'objet

Cette enquête vise à résoudre une erreur de compilation rencontrée lors de la désérialisation du JSON polymorphe à l'aide de Jackson. ObjectMapper. Plus précisément, l'erreur réside dans la ligne :

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

Explication du problème :

L'erreur provient d'une inadéquation entre la signature de la méthode readValue() et les arguments fourni. readValue() attend deux arguments : un JsonParser et une Class, mais dans ce code, un ObjectNode (pas un JsonParser) et un sous-type d'Animal (pas Animal lui-même) sont transmis.

Annotation- Solution de polymorphisme basée :

Comme alternative à l'approche basée sur le registre mentionnée dans le didacticiel, envisagez d'utiliser la méthode de Jackson. approche basée sur les annotations pour la désérialisation polymorphe. Cela implique :

  1. Annoter la classe Animal : Utilisez @JsonTypeInfo pour définir la façon dont les informations de type sont stockées dans le JSON, ainsi que @JsonSubTypes pour spécifier les sous-types possibles.
  2. Annoter les sous-classes (par exemple, Chien et Chat) : Utiliser @JsonTypeId pour définir le nom de la propriété qui contient les informations de type.

Exemple d'implémentation :

// An abstract base class for animals
@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 { ... }

// Subclass for dogs
public class Dog extends Animal { ... }

// Subclass for cats
public class Cat extends Animal { ... }

// Test class
public class Test {

  public static void main(String[] args) {
    ObjectMapper mapper = new ObjectMapper();
    ... // Serialize and deserialize animals as shown in the provided solution
  }
}
Copier après la connexion

En utilisant des annotations, Jackson peut déduire le type de l'objet en fonction des informations de type fournies dans le JSON, évitant ainsi le besoin d'un registre et résolvant l'erreur de compilation.

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