1

reddit API から POJO への一部のコンテンツのデシリアライズに取り組んでいます。Reddit 内のエンティティ間の JSON 構造は通常同じであるため、私の目標はコードを可能な限り単純化することです。

例として、リンク オブジェクトを逆シリアル化する JSON は次のようになります。

[
    {
        "kind": "Listing",
        "data": {
            "modhash": "",
            "children": [
                {
                    "kind": "t3",
                    "data": {
                        "title": "A sample link from reddit"
                    }
                }
            ]
        }
    }
]

これは問題なくデシリアライズできますが、reddit コメントはその下のオブジェクト内にkindoft1と異なる構造を持つことで異なるdataため、複数のコピーされたクラスを作成する代わりに、それをラップする JSON に同じクラス構造を再利用したいと考えています。 1 行または 2 行の違いがあります。

空のインターフェイス を作成し、それを実装するクラスRedditEntityを作成しました。RedditLink私の問題は、デシリアライズするインターフェイスの実装をジャクソンに伝える方法がわからないことです。通常は@JsonSubTypeアノテーションを使用しますが、それはオブジェクト内のメンバーに対してのみ機能し、それをラップするメンバーに対しては機能しません。また、親オブジェクトから型を判別できる同様のレベルで機能するカスタム デシリアライザーを作成する方法もわかりません。

私の質問は、その上の型dataに基づいてオブジェクトをどのように逆シリアル化できるかということです。kind

4

1 に答える 1

0

上記のタイプを知る必要があるのはなぜですか?これはうまくいくはずです:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "kind")
@JsonSubTypes({
        @JsonSubTypes.Type(RedditListing.class),
        @JsonSubTypes.Type(RedditLink.class),
        @JsonSubTypes.Type(RedditComment.class)})
public static interface RedditEntity {}

@JsonTypeName("Listing")
public static class RedditListing implements RedditEntity { ... }

@JsonTypeName("t1")
public static class RedditComment implements RedditEntity { ... }

@JsonTypeName("t3")
public static class RedditLink implements RedditEntity { ... }
于 2013-11-12T21:00:37.843 に答える