10

私が定義していない JSON のシリアル化 (逆) 処理に問題があります。

問題を説明するコードと JSON を次に示します。

コード:

public static class Base {
    public String klass = "base";
}

public static class SubBase extends Base {
}

public static class Sub1 extends SubBase {
    public Sub1() {
        klass = "Sub1";
    }
}

public static class Sub2 extends SubBase {
    public Sub2() {
        klass = "Sub2";
    }
}

public static class Holder {
    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_ARRAY, property="type")
    @JsonSubTypes({@JsonSubTypes.Type (name = "sub1", value = Sub1.class),@JsonSubTypes.Type(name = "sub2", value = Sub2.class)})
    public List<Base> items = new ArrayList<Base>();
}


Holder holder = new Holder();
holder.items.add(new Sub1());
holder.items.add(new Sub1());

mapper.writeValueAsString(holder);

生産する

{"items":[["sub1",{"klass":"Sub1"}],["sub1",{"klass":"Sub1"}]]}

JsonTypeInfo アノテーションを

    @JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT, property="type")

生産する

{"items":[{"sub1":{"klass":"Sub1"}},{"sub1":{"klass":"Sub1"}}]}

これまでのところ、すべて問題ありません:)

ただし、サーバーから取得している JSON の構造は少し異なります。

{"type":"sub1", "items":[{"klass":"Sub1"},{"klass":"Sub1"}]}

項目配列の型は、"type" プロパティで定義されます ("items" 配列内のすべての項目は同じクラスであることに注意してください)。
これを実現するために使用する JsonTypeInfo の組み合わせがわかりません。「include」を「.EXTERNAL_PROPERTY」に設定しようとしましたが、これは機能しません。
このインクルージョンを使用して逆シリアル化すると、「Exception in thread "main" org.codehaus.jackson.JsonGenerationException: Can't write a field name, expected a value」エラー メッセージが表示されます。

私の質問は次のとおりです: ' {"type":"sub1", "items":[{"klass":"Sub1"},{"klass":"Sub1"}]} 'ホルダーの " type " プロパティに基づいて、すべての Sub1 インスタンスで 'items' 配列を埋めますか?
これが不可能な場合、これを達成する別の方法はありますか (Holder のカスタム シリアライザーを必要とせずに、'items' 配列だけのカスタム シリアライザーで問題ありません)。

ありがとう!

4

1 に答える 1

5

表示する JSON を自動的にマップする方法はありません。Jackson がサポートする 4 つのタイプの 1 つではありません。

サーバーがより標準的な構造 (自動サポートが存在する) を作成できない場合は、カスタム デシリアライザーを作成する必要があります。または、最初に中間の簡単にマッピング可能な構造 (JsonNodeまたは などMap) にデータバインディングを行い、次にそれを使用して手動でタイプを抽出する目的の構造に (たとえば、ObjectMapper.convertValue(object, resultType).

于 2013-02-22T18:34:19.990 に答える