I am not sure whether it is simplest solution, but I think that you can do it in this way:
- Create new List implementation
- Write serializer for new type
- Use this type in your POJO classes
New Java class which extends ArrayList
:
@JsonSerialize(using = JacksonListSerializer.class)
class JacksonList<E> extends ArrayList<E> {
private static final long serialVersionUID = 1L;
}
Serializer for above class:
class JacksonListSerializer extends JsonSerializer<JacksonList<?>> {
@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();
}
}
Now, you can use this list in your example:
public static void main(String[] args) throws IOException {
ObjectMapper om = new ObjectMapper();
List<Common> list = new JacksonList<Common>();
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()));
}
Above example prints:
[{"type":"CODE"},{"type":"CODE"}]
{"type":"CODE"}