【发布时间】:2013-01-04 19:55:43
【问题描述】:
我有以下示例类:
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]
当然,编写自定义反序列化程序可以解决问题,但是如果没有自定义反序列化程序就可以进行反序列化吗?
谢谢, 贝扎德
【问题讨论】:
-
将 JSON 数组(集合)反序列化为 Java 对象(Zoo -- 这不是集合)将不起作用(没有特殊处理)。您是否必须使用 DefaultTyping 来提供类型信息?您可能想在programmerbruce.blogspot.com/2011/05/… 上查看完整的多态反序列化示例
-
我建议你选择一个标签来替换为java(让问题更加关注)。
-
@Programmer_Bruce 我认为这里的数组是由于包含默认类型信息,所以应该没问题。
标签: java json generics polymorphism jackson