在JSON序列化之前更改对象

Dav*_*vid 2 java serialization json jackson

我想在JSON序列化之前更改对象.为此,我使用change方法创建了一个接口,任何实现此接口的类都将"尝试"自行更改.(是的,可能这样做不是最佳的,但例如清酒会这样做)

@JsonSerialize(using = ChangesValuesSerializer.class)
public interface ChangesValues {
    void changeValues();
}
Run Code Online (Sandbox Code Playgroud)

现在,是ChangesValuesSerializer我正在实施的serialize方法.并想知道,我怎么能说杰克逊,把它称为内置的序列化器对象.

class ChangesValuesSerializer extends JsonSerializer<ChangesValues> {

    @Override
    public void serialize(ChangesValues changesValues, JsonGenerator jsonGenerator,
            SerializerProvider serializerProvider) throws IOException,
            JsonProcessingException {

        changesValues.changeValues();

        // ***
        // ->> Just call Jacksons default serializer
        // ***
    }

}
Run Code Online (Sandbox Code Playgroud)

Ale*_*lov 6

您可以使用它BeanSerializerModifier来访问默认的序列化程序并使用您自己的委托覆盖它.在委托内,您可以更改序列化对象并调用默认序列化程序.这是一个例子:

public class JacksonSerializeModifier {
    public static class Bean {
        public final String value;

        public Bean(final String value) {
            this.value = value;
        }

        public void foo() {
            System.out.println("foo() invoked");
        }
    }

    private static class MyBeanSerializerModifier extends BeanSerializerModifier {
        @Override
        public JsonSerializer<?> modifySerializer(
                final SerializationConfig serializationConfig,
                final BeanDescription beanDescription,
                final JsonSerializer<?> jsonSerializer) {
            return new ModifyingSerializer((JsonSerializer<Object>) jsonSerializer);
        }
    }

    private static class ModifyingSerializer extends JsonSerializer<Object> {
        private final JsonSerializer<Object> serializer;

        public ModifyingSerializer(final JsonSerializer<Object> jsonSerializer) {
            this.serializer  = jsonSerializer;
        }

        @Override
        public void serialize(
                final Object o,
                final JsonGenerator jsonGenerator,
                final SerializerProvider serializerProvider)
        throws IOException {
            if (o instanceof Bean) {
                ((Bean) o).foo();
            }
            serializer.serialize(o, jsonGenerator, serializerProvider);
        }
    }

    public static void main(String[] args) throws JsonProcessingException {
        SimpleModule module = new SimpleModule();
        module.setSerializerModifier(new MyBeanSerializerModifier());
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);
        System.out.println(mapper.writeValueAsString(new Bean("abc")));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

foo() invoked
{"value":"abc"}
Run Code Online (Sandbox Code Playgroud)