如果事先知道类型,编写自定义序列化程序非常简单。例如。 MyType
可以写MyTypeSerializer extends StdSerializer<MyType>
。见http://wiki.fasterxml.com/JacksonHowToCustomSerializers
但是,让我们说:
这意味着我需要编写一个应该处理所有类型的串行器(“catch-all”)并且可以决定它是否支持它(4.)。我天真地尝试了CatchAllSerializer extends StdSerializer<Object>
,但它根本没有被触发。
如何编写/注册将捕获所有类型的序列化程序,可以决定它是否支持给定类型并提供序列化机制?
答案 0 :(得分:2)
您可以为ObjectMapper
设置BeanSerializerModifier以覆盖委托序列化程序中的所有bean序列化程序,该序列化程序根据对象类型决定使用哪种序列化形式。
以下是一个例子:
public class JacksonSerializerModifier {
public static interface A {
}
public static class B implements A {
public String field1 = "value1";
@Override
public String toString() {
return field1;
}
}
public static class C implements A {
public String field2 = "value2";
@Override
public String toString() {
return field2;
}
}
public static class D {
public String field3 = "value3";
}
private static class MyTypeSerializer extends JsonSerializer<Object> {
private final JsonSerializer<Object> delegate;
@SuppressWarnings("unchecked")
public MyTypeSerializer(JsonSerializer<?> delegate) {
this.delegate = (JsonSerializer<Object>) delegate;
}
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
throws IOException {
if (value instanceof A) {
jgen.writeString(value.toString());
} else {
delegate.serialize(value, jgen, provider);
}
}
}
public static void main(String[] args) throws JsonProcessingException {
SimpleModule module = new SimpleModule();
module.setSerializerModifier(new BeanSerializerModifier() {
@Override
public JsonSerializer<?> modifySerializer(SerializationConfig config,
BeanDescription beanDesc,
JsonSerializer<?> serializer) {
return new MyTypeSerializer(serializer);
}
});
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);
System.out.println(mapper.writeValueAsString(Arrays.asList(new B(), new C(), new D())));
}
}
输出:
["value1","value2",{"field3":"value3"}]