私が定義していない 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' 配列だけのカスタム シリアライザーで問題ありません)。
ありがとう!