6

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

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

…</p>

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

我错过了什么还是应该提交错误报告?

4

1 回答 1

4

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

Jackson 只查看顶级参数的运行时类型writeValueAsString,因为方法参数具有类型Object;在 Java 中不可能知道作为参数传递给方法的对象的声明类型(即使使用泛型,由于类型擦除),所以你的前两个示例(writeValueAsString(nut)并且writeValueAsString(object)实际上是相同的)。

更多信息在这里:http: //jackson-users.ning.com/forum/topics/mapper-not-include-type-in​​formation -when-serializing-object-why

于 2013-01-29T18:20:07.243 回答