Jackson自定义序列化器忽略@JsonIdentityInfo

时间:2015-08-11 16:19:55

标签: java json serialization jackson jsonserializer

我创建了一个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类的信息不会重复。但在第一种情况下,对象的儿子被放了两次。

0 个答案:

没有答案