gpt4 book ai didi

java - 在 JSON 序列化之前更改对象

转载 作者:行者123 更新时间:2023-12-02 23:49:08 25 4
gpt4 key购买 nike

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

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

现在,是 ChangesValuesSerializer 类,我正在实现 serialize 方法。并且想知道,我该怎么说 Jackson,来调用它内置于对象上的序列化器。

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
// ***
}

}

最佳答案

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

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"}

关于java - 在 JSON 序列化之前更改对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25509699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com