杰克逊:重写JsonSerializable.serialize()

时间:2015-12-21 23:32:07

标签: java json serialization jackson

我有一个包含很多子类的抽象类。我想通过实现Jackson的JsonSerializable接口向父级和大多数子系统添加自定义序列化功能。在sub中扩展父级序列化的最佳方法是什么?要编写一个合适的Json对象,我需要在调用JsonGenerator.writeStartObject()+ writeEndObject()之间放置序列化代码。所以只是重写JsonSerializable.serialize就像这样做:

 class Parent implements JsonSerializable {

        String parentField;

        @Override
        public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException {

            gen.writeStartObject();
            gen.writeStringField("parentField", parentField);
            gen.writeEndObject(); // Closing Object..
        }

        @Override
        public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {}

 }

    class Sub extends Parent {

        String subField;

        @Override
        public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException {

            super.serialize(gen, serializers); 
            //-> Json-object already closed, subField ends up outside..
            gen.writeStringField("subField", subField); 

        }


    }

1 个答案:

答案 0 :(得分:0)

您可以通过将工作委托给其他方法来使用经典继承和多态:

    public class Parent implements JsonSerializable {

        String parentField;

        @Override
        public void serialize(JsonGenerator gen, SerializerProvider serializers) throws IOException {

            startSerialize(gen);
            doSerialize(gen, serializers);
            endSerialize(gen);
        }

        @Override
        public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
        }

        protected void startSerialize(JsonGenerator gen) throws IOException {
            gen.writeStartObject();
        }

        protected void doSerialize(JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStringField("parentField", parentField);
        }

        protected void endSerialize(JsonGenerator gen) throws IOException {
            gen.writeEndObject(); // Closing Object..
        }
    }

    public class Sub extends Parent {

        String subField;

        @Override
        protected void doSerialize(JsonGenerator gen, SerializerProvider serializers) throws IOException {
            gen.writeStringField("subField", subField);
        }
    }
}