4

JavaでJersey/Jacksonを使用してJSONを逆シリアル化しようとしています。

これが私のJSONの例です

    {
        "text":"toto",
        "link":"titi",
        "items":[{
            "text":"toutou",
            "link":"tata",
            "items":[{
                "text":"toto2",
                "link":"toutou2",
                "data":"tonti",
            ]}
        ]}
    }

だから私のJavaモデルのパーツはこのように見えます

public IItem {
    ...
}

public Item implements IItem {
    List<IItem> items;
    String text;
    String link;
    ...
}

public ItemData extends Item {
    String data;
    ...
}

これで、JSONを逆シリアル化しようとすると、オブジェクトマッパーは使用する具象クラスを認識しません。どうすれば彼にこれを伝えることができますか?アイテムが欲しいということです(アイテムのリスト(ItemDataのリスト))。

すべてのフィールド(テキスト、リンク、データ)を含む1つのオブジェクトのみを使用したことがありますが、私にはこのタイプのデザインの方が適しています。それだけの価値があると思いますか?

実際には、JSON構造が少し複雑であるため、複製するフィールドが複数あります。わかりやすくするために、フィールドを簡略化しました。

質問2:その後、オブジェクトをJSONで再度シリアル化する必要があります(最初の部分は一時的な開発用であり、後でJDBCドライバーからオブジェクトを入力します)。ジャージに一度に1つのレベルのみを表示するように指示するにはどうすればよいですか?

つまり、私/は最初のレベルだけが欲しいと要求します、答えは次のようになります:

    {
        "text":"toto",
        "link":"titi",
        "items":[{
            "text":"toutou",
            "link":"tata",
        ]}
    }

そして私/tataが答えを要求するならば:

    {
        "text":"toutou",
        "link":"tata",
        "items":[{
            "text":"toto2",
            "link":"toutou2",
            "data":"tonti"
        ]}
    }

(質問は、最初のリクエストで2番目のレベルを非表示にする方法に関するもので、2番目のリクエストの処理方法を理解しています)。

ありがとう、

4

1 に答える 1

7

Jacksonを使用している場合は、このような場合に適切な逆シリアル化を可能にする機能があります(アイテムのポリモーフィックリスト)。@JsonTypeInfoアノテーションを使用して、オブジェクトタイプをJSONに含めることを指定できます。これは、正しいインスタンスを逆シリアル化するために使用されます。次に例を示します。

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
public IItem {
    // ...
}

これにより、@ classと呼ばれるIItemの各シリアル化された表現に属性が追加されます。これは、Jacksonが検出し、後で正しいオブジェクトインスタンスを逆シリアル化するために使用します。

于 2012-11-30T13:00:40.877 に答える