繁体   English   中英

用Java的Jackson序列化异构集合

[英]Serialzing heterogeneous collection with Jackson in Java

我正在使用Jackson来序列化异构列表。 我的清单是这样声明的:

   List<Base> myList = new LinkedList<>();

我在那里有AggregateSource类:

    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节。有两种选择:

  1. om.enableDefaultTyping()将存储存储为Object或抽象类型(包括接口)的元素的类名称。 有关过载,请参阅文档。 这将自动处理集合。

  2. @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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM