我创建了一个JacksonList类和JacksonListSerializer(扩展了JSonSerializer)来解决集合和继承类的问题。工作正常。
问题是序列化程序忽略了JsonIdentityInfo“规则”。我有映射异常,例如“已经有了POJO for id(java.lang.Integer)..”
我在下面举例:
JacksonList.java
@JsonSerialize(using = JacksonListSerializer.class)
class JacksonList<E> extends ArrayList<E> {
private static final long serialVersionUID = 1L;
}
JacksonListSerializer.java
public 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();
}
}
FirstItem.java
public class FirstItem {
private Son son;
public Son getSon() {
return son;
}
public void setSon(Son son) {
this.son = son;
}
}
Son.java
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id", scope=Son.class)
public class Son {
public Son(String text) {
this.text = text;
}
private String text;
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
Main.java ObjectMapper mapper = new ObjectMapper();
FirstItem f1 = new FirstItem();
FirstItem f2 = new FirstItem();
JacksonList<FirstItem> jacksonList = new JacksonList<FirstItem>();
List<FirstItem> list = new ArrayList<FirstItem>();
Son son = new Son();
f1.setSon(son);
f2.setSon(son);
list.add(f1);
list.add(f2);
jacksonList.add(f1);
jacksonList.add(f2);
System.out.println(mapper.writeValueAsString(jacksonList));
System.out.println(mapper.writeValueAsString(list));
输出:
{"JacksonList":[{"FirstItem":{"id":1,"son":{"type":"com.Son","@id":1}}},{"FirstItem":{"id":2,"son":{"type":"com.Son","@id":1}}}]}
{"ArrayList":[{"id":1,"son":{"type":"com.Son","@id":1}},{"id":2,"son":1}]}
正如您在第二种情况(ArrayList的打印)中看到的那样,Son类的信息不会重复。但在第一种情况下,对象的儿子被放了两次。