ホームページ > Java > &#&チュートリアル > Jackson を使用して多態性 JSON を多態性型に逆シリアル化する方法は?

Jackson を使用して多態性 JSON を多態性型に逆シリアル化する方法は?

DDD
リリース: 2024-11-12 00:57:02
オリジナル
477 人が閲覧しました

How to Deserialize Polymorphic JSON with Jackson into Polymorphic Types?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート