[英]Serialzing heterogeneous collection with Jackson in Java
我正在使用Jackson来序列化异构列表。 我的清单是这样声明的:
List<Base> myList = new LinkedList<>();
我在那里有Aggregate
和Source
类:
myList.add(new Aggregate("count"));
myList.add(new Aggregate("group"));
myList.add(new Source("reader"));
这些类均实现Base
接口。 每个类只有一个具有get / set方法的属性: Aggregate
具有“ type”,而Source
具有“ name”。
我使用以下代码尝试序列化列表:
ObjectMapper om = new ObjectMapper();
om.configure(SerializationFeature.INDENT_OUTPUT, true);
StringWriter c = new StringWriter();
om.writeValue(c, myList);
System.out.println(c);
但我发现输出JSON没有任何有关序列化对象类型的指示:
[ {
"type" : "count"
}, {
"type" : "group"
}, {
"name" : "reader"
} ]
因此,我认为我无法对流进行反序列化并使其按预期工作。 如何在异构集合中包含有关每个对象的序列化表示形式的类信息,以便可以正确地反序列化该集合?
这在http://wiki.fasterxml.com/JacksonPolymorphicDeserialization中进行了准确描述。 阅读它,但这是最相关的部分。
要包括元素的类型信息,请参见第1节。有两种选择:
om.enableDefaultTyping()
将存储存储为Object
或抽象类型(包括接口)的元素的类名称。 有关过载,请参阅文档。 这将自动处理集合。
用@JsonTypeInfo
注释Base
(例如, @JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
)。 为了使这个与集合一起工作,您还需要告诉Jackson您要存储List<Base>
(请参见第5节):
om.writerWithType(new TypeReference<List<Base>>() {}).writeValue(...);
要么
JavaType listBase = objectMapper.constructCollectionType(List.class, Base.class); om.writerWithType(listBase).writeValue(...);
我已使我的代码正常工作。
一开始,我以为可以使用WRAP_ROOT_VALUE
来获取类信息:
om.writer().with(SerializationFeature.WRAP_ROOT_VALUE).writeValue(c, myList);
那是行不通的,因为它只使根项具有类信息,而没有其他任何信息。 我曾希望它可以递归地应用。
所以,我只好也退出使用List<>
直接缠上了我的List<>
在其自己的类的对象。 然后,基本接口需要修饰以告知其编写类信息:
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include= JsonTypeInfo.As.PROPERTY, property="class")
public interface Base {
}
这使序列化程序可以编写一个带有类值的“ class”属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.