使用Jackson序列化类型集合时出错

我正在尝试使用混音序列化一个集合,但jackson不会保存类型信息。 这是一个基本测试,说明了会发生什么:

public class CollectionSerializationTest { interface Common extends Serializable { } class A implements Common { private static final long serialVersionUID = 1L; } @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value = A.class, name = "CODE") }) class AMixIn { } @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @JsonSubTypes.Type(value = B.class, name = "CODE") }) class BMixIn { } class B implements Common { private static final long serialVersionUID = 1L; } @Test public void test() throws JsonGenerationException, JsonMappingException, IOException { ObjectMapper om = new ObjectMapper(); List list = new ArrayList(); A a = new A(); B b = new B(); list.add(a); list.add(b); om.getSerializationConfig().addMixInAnnotations(A.class, AMixIn.class); om.getSerializationConfig().addMixInAnnotations(B.class, BMixIn.class); System.out.println(om.writeValueAsString(list)); // Outputs [{},{}] System.out.println(om.writeValueAsString(a));// Outputs {"type":"CODE"} } } 

如何在第一个输出上实现输出[{"type":"CODE"},{"type":"CODE"}]

我不确定它是否是最简单的解决方案,但我认为你可以这样做:

  1. 创建新的List实现
  2. 为新类型编写序列化器
  3. 在POJO类中使用此类型

扩展ArrayList新Java类:

 @JsonSerialize(using = JacksonListSerializer.class) class JacksonList extends ArrayList { private static final long serialVersionUID = 1L; } 

上述类的序列化器:

 class JacksonListSerializer extends JsonSerializer> { @Override public void serialize(JacksonList list, JsonGenerator generator, SerializerProvider provider) throws IOException, JsonProcessingException { generator.writeStartArray(); if (list != null) { for (Object item : list) { generator.writeObject(item); } } generator.writeEndArray(); } } 

现在,您可以在示例中使用此列表:

 public static void main(String[] args) throws IOException { ObjectMapper om = new ObjectMapper(); List list = new JacksonList(); list.add(new A()); list.add(new B()); om.addMixInAnnotations(A.class, AMixIn.class); om.addMixInAnnotations(B.class, BMixIn.class); System.out.println(om.writeValueAsString(list)); System.out.println(om.writeValueAsString(new A())); } 

以上示例打印:

 [{"type":"CODE"},{"type":"CODE"}] {"type":"CODE"}