次のサンプルクラスがあります。
class Zoo {
public Collection<? extends Animal> animals;
}
シリアル化するときは、次のようにして、できるだけ多くの型情報をシリアル化しようとしています。
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
そして、次の JSON を取得します。
[
"com.bp.samples.json.generics.Zoo",
{
"animals": [
"java.util.ArrayList",
[
[
"com.bp.samples.json.generics.Bird",
{
"name": "bird-1",
"wingSpan": "6 feets",
"preferredFood": "food-1"
}
],
[
"com.bp.samples.json.generics.Cat",
{
"name": "cat-1",
"favoriteToy": "toy-1"
}
],
[
"com.bp.samples.json.generics.Dog",
{
"name": "dog-1",
"breed": "bread-1",
"leashColor": "black"
}
]
]
]
}
]
逆シリアル化に関しては、次のことを試みます。
mapper.readValue(new File("./DataFiles/Zoo-2.json"), Zoo.class);
次の例外が発生します。
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException:
Can not deserialize instance of com.bp.samples.json.generics.Zoo out of START_ARRAY toke
やろうとしている:
mapper.readValue(new File("./DataFiles/Zoo-2.json"),
new TypeReference<Collection<? extends Animal>>() {});
結果:
Can not construct instance of com.bp.samples.json.generics.Animal,
problem: abstract types either need to be mapped to concrete types, have custom
deserializer, or be instantiated with additional type information
at [Source: ./DataFiles/Zoo-2.json; line: 2, column: 5]
もちろん、カスタム デシリアライザーを作成することで問題は解決しますが、カスタム デシリアライザーを使用せずにデシリアライズする方法はありますか?
ありがとう、ベザド