将默认序列化程序应用于Jackson的自定义序列化程序中的属性

时间:2015-06-09 18:30:56

标签: java json serialization jackson

我有一个需要序列化的对象,但我遇到了一些问题。我需要一个自定义序列化程序来序列化无效对象与有效对象。因此,我编写了一个自定义序列化程序,如下所示:

public class MySerializer extends JsonSerializer<MyObject> {

    @Override
    public void serialize(MyObject obj, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        if(obj.isValid()){
            jgen.writeObject(obj.getInvalids());
        }
        else{
            jgen.writeObject(obj);
        }
        jgen.writeEndObject();
    }
}

现在,当我尝试序列化时,如果无限递归,我会收到错误(原因很清楚)。所以我想知道我是否可以这样做,而不必将我的代码改为:

public class MySerializer extends JsonSerializer<MyObject> {

    @Override
    public void serialize(MyObject obj, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        if(obj.isValid()){
            jgen.writeObject(obj.getInvalids());
        }
        else{
            jgen.writeObjectField("prop1", obj.getProp1());
            jgen.writeObjectField("prop2", obj.getProp2());
            ...
        }
        jgen.writeEndObject();
    }
}

有没有更清洁的方式(而且不那么讨厌)的方式来做我想做的事情?我见过this answer to a similar question, but it is quite terse and I was unable to divine a clear solution from it.

1 个答案:

答案 0 :(得分:0)

访问&#34;默认&#34;的方式序列化程序(如果你没有提供自定义程序,杰克逊会建立一个程序)是通过注册BeanSerializerModifier(使用SimpleModule注册它),然后覆盖modifySerializer()。它被赋予默认的序列化程序,然后您可以构建自己的序列化程序,然后可以根据需要进行委托。