如何为jackson编写一个全能(de)序列化器

如果事先知道类型,编写自定义序列化程序非常简单。 例如。 MyType可以写一个MyTypeSerializer extends StdSerializer 。 请参阅http://wiki.fasterxml.com/JacksonHowToCustomSerializers

但是,让我们说:

  1. 我有几种类型(接口)的对象通过jackson序列化。
  2. 我事先并不知道这些对象的类型。
  3. 我无法在这些类型上添加注释。
  4. 所有这些objets都可以转换为我知道的常见类型,以便我可以获取其状态数据,键入不属于其界面的类型。

这意味着我需要编写一个应该处理所有类型的串行器(“catch-all”)并且可以决定它是否支持它(4.)。 我天真地尝试过CatchAllSerializer extends StdSerializer但它根本没有被触发。

如何编写/注册将捕获所有类型的序列化程序,可以决定它是否支持给定类型并提供序列化机制?

您可以为ObjectMapper设置BeanSerializerModifier ,以覆盖委托序列化程序上的所有bean序列化程序,该序列化程序根据对象类型决定使用哪种forms的序列化。

这是一个例子:

 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 { private final JsonSerializer delegate; @SuppressWarnings("unchecked") public MyTypeSerializer(JsonSerializer delegate) { this.delegate = (JsonSerializer) 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"}]