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>)
Déclenchée par la ligne :
return mapper.readValue(root, animalClass);
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; } }
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; }
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!