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
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 :
@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; } }
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!