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)
您可以使用它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)
| 归档时间: |
|
| 查看次数: |
2475 次 |
| 最近记录: |