杰克逊:阵列中缺少@JsonTypeInfo

时间:2013-01-29 11:57:10

标签: java json serialization jackson

我发现了杰克逊JSON处理器库的一些奇怪的行为,我很好奇这是故意还是错误。请看下面的代码:

@JsonTypeInfo(use = Id.NAME)
public class Nut {}

...

ObjectMapper mapper = new ObjectMapper();

Nut nut = new Nut();
Object object = new Nut();
Nut[] nuts = new Nut[] { new Nut() };
Object[] objects = new Object[] { new Nut() };

System.out.println(mapper.writeValueAsString(nut));
System.out.println(mapper.writeValueAsString(object));
System.out.println(mapper.writeValueAsString(nuts));
System.out.println(mapper.writeValueAsString(objects));

输出:

{"@type":"Nut"}
{"@type":"Nut"}
[{"@type":"Nut"}]
[{}]

我期望(和想要)的是以下内容:

{"@type":"Nut"}
{"@type":"Nut"}
[{"@type":"Nut"}]
[{"@type":"Nut"}] // <<< type information included

我是否会遗漏某些内容或应该提交错误报告?

1 个答案:

答案 0 :(得分:4)

这是预期的行为。遍历对象图以进行序列化时,Jackson在确定要包含的类型信息时使用声明的类型的对象。 objects中的元素已声明类型为Object,您没有告诉Jackson包含任何类型信息。

Jackson只查看writeValueAsString的顶级参数的运行时类型,因为method参数的类型为Object;在Java中不可能知道作为方法的参数传递的对象的声明类型(即使使用泛型,这要归功于类型擦除),因此前两个示例(writeValueAsString(nut)writeValueAsString(object)是有效的相同的)。

此处提供更多信息:http://jackson-users.ning.com/forum/topics/mapper-not-include-type-information-when-serializing-object-why