java - jackson :数组中缺少@JsonTypeInfo

标签 java json serialization jackson

我发现 Jackson JSON Processor 库有一些奇怪的行为,我很好奇这是故意的还是错误。请看下面的代码:

@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

我是否遗漏了什么或者我应该提交错误报告?

最佳答案

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

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

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

关于java - jackson :数组中缺少@JsonTypeInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14582343/

相关文章:

javascript - 合并 JSON 文件?

android - 序列化对象以在 Android 上发送 Intent

c - Protocol Buffer nanopb序列化字符串和解码错误utf-8字符

java - 我们可以序列化一个没有任何成员的类吗

java - 无法在 java Swing 中创建登录表单

java - 您将如何从命令行参数中拆分字符串? - java

java - 用于删除 Java 应用程序当前文本字段中的条目的 SQL 命令

java - 从 Java 套接字 InputStream 读取请求内容,总是在 header 之后挂起

python - 将 pandas dataframe json 列切成列

json - ObservedObject,派生自Json,不加载到Picker,而是加载到List。在 SwiftUI 中,Xcode 11