ジャクソンのポリモーフィックな質問があります。JSON データをポリモーフィック型にデシリアライズしたいと考えています。Jackson のドキュメントを読むと、JSON データをポリモーフィック型に逆シリアル化できます。ただし、私には特別なケースがあります。次のようなクラス構造があります。
class Supreme {
private String type;
}
class Foo extends Supreme {
public String label;
}
class Bar extends Supreme {
}
注: Class Bar には、継承された「type」フィールド以外のメンバー変数はありません。
その構造を次のように変換しました。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property ="type")
@JsonSubTypes({@Type(value = Foo.class, name = "Foo"),@Type(value = Bar.class, name = "Bar") })
class Supreme {
}
class Foo extends Supreme {
public String label;
}
class Bar extends Supreme {
}
String data=
"[{
"type": "Foo",
"label": "abc"
},
{
"type": "Bar"
}]"
上記のjsonデータを次のように渡すと:
new ObjectMapper().readValue(data, new TypeReference<List<Supreme>>());
「END_TOKEN からクラス Bar をデシリアライズできません」のようなメッセージが表示されます。これは、JsonTypeInfo および JsonSubTypes アノテーションが「type」プロパティを解析し、配列の 2 番目のエンティティを Bar クラスにマップする必要があることがわかったためだと思います。ただし、その 2 エンティティの type プロパティの後に「何か」を見つけようとします。つまり、Jackson はそれが空の JSON オブジェクトであると考えています。
(注: 配列の 2 番目のエントリのない上記のデータは正常に機能します。つまり、少なくとも "type" 以外のプロパティがあるため、Foo オブジェクトを含むリストに逆シリアル化できます)
これを回避する方法はありますか?