無法使用 Jackson 將 JSON反序列化為多態性類型
問題:
嘗試時反序列化多態性JSON數據,編譯時遇到錯誤時間:
The method readValue(JsonParser, Class) in the type ObjectMapper is not applicable for the arguments (ObjectNode, Class<capture#6-of ? extends Animal>)
由行:
return mapper.readValue(root, animalClass);
觸發:
要解決這個問題,我們可以使用註解來指示基底類別(Animal)與其子類別(Dog和 Cat)之間的多態關係。透過在 Animal 類別中宣告 @JsonTypeInfo、@JsonSubTypes 和 @JsonIgnoreProperties 註解,ObjectMapper 將獲知類別的多態性。
附註解的 Animal 類別:
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; } }
子類別聲明:
以下列方式定義為以下 Dog Dog 和 Cat子類別:
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; }
這種利用註解的更新方法將實現多態 JSON 的無縫序列化和反序列化。
以上是如何使用 Jackson 將多型 JSON 反序列化為多型態?的詳細內容。更多資訊請關注PHP中文網其他相關文章!