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 にクラスの多態性の性質が通知されます。
アノテーション付き動物クラス:
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 および 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 中国語 Web サイトの他の関連記事を参照してください。