【问题标题】:Change Object just before JSON serialization在 JSON 序列化之前更改对象
【发布时间】:2014-08-26 15:31:32
【问题描述】:

我想在 JSON 序列化之前更改一个对象。为此,我创建了一个带有更改方法的接口,任何实现此接口的类都将“尝试”更改自身。 (是的,可能这样做不是最优的,但例如清酒会这样做

@JsonSerialize(using = ChangesValuesSerializer.class)
public interface ChangesValues {
    void changeValues();
}

现在,是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
        // ***
    }

}

【问题讨论】:

  • super() 不能解决问题吗?
  • 这是抽象方法
  • 我的方式有点“hackish”,但你可以在这里查看:stackoverflow.com/questions/25511604/… 它更干净,可以在更广泛的应用程序中使用。

标签: java json serialization jackson


【解决方案1】:

您可以使用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")));
    }
}

输出:

foo() invoked
{"value":"abc"}

【讨论】:

  • @你能指出反序列化的正确方向吗?
  • 如果我将 @JsonSerialize 注释放在类级别,则不会调用 modifySerializer。我的要求是大多数时候需要使用 JsonSerialize ,这是在课堂上提到的,但有时需要以不同的方式进行序列化。有什么办法吗?
【解决方案2】:

如果是抽象类,这是不可行的。

您可以通过添加另一个扩展 JSON 序列化器的类(即 BasicJSONSerializer)并从那里调用方法来绕过它。即

class BasicJSONSerializer extends JsonSerializer<ChangesValues> {}

class ChangesValuesSerializer extends JsonSerializer<ChangesValues> {

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

        changesValues.changeValues();

        new BasicJSONSerializer().serialize(changesValues, jsonGenerator, serializerProvider);
    }
}

但这似乎是一种技巧,老实说,可能需要更好的设计。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多