如何在自定义序列化程序中访问默认的jackson序列化

我想创建一个自定义序列化程序,它可以完成一些工作,然后将其余部分用于默认序列化。

例如:

@JsonSerialize(using = MyClassSerializer.class) public class MyClass { ... } public class MyClassSerializer extends JsonSerializer { @Override public void serialize(MyClass myClass, JsonGenerator generator, SerializerProvider provider) throws JsonGenerationException, IOException { if (myClass.getSomeProperty() == someCalculationResult) { provider.setAttribute("special", true); } generator.writeObject(myClass); } } 

有了为聚合对象创建其他自定义序列化程序的想法,这些对象基于’speical’属性值表现不同。 但是,上面的代码不起作用,因为毫不奇怪的是进入无限递归。

有没有办法告诉jackson在设置属性后使用默认序列化? 我真的不想枚举像许多自定义序列化程序一样的所有属性,因为类相当复杂,我不想每次更改类时都要对序列化程序进行双重维护。

BeanSerializerModifier将为您提供对默认序列化的访问。

将默认序列化程序注入自定义序列化程序

 public class MyClassSerializer extends JsonSerializer { private final JsonSerializer defaultSerializer; public MyClassSerializer(JsonSerializer defaultSerializer) { this.defaultSerializer = checkNotNull(defaultSerializer); } @Override public void serialize(MyClass myclass, JsonGenerator gen, SerializerProvider provider) throws IOException { if (myclass.getSomeProperty() == true) { provider.setAttribute("special", true); } defaultSerializer.serialize(myclass, gen, provider); } } 

MyClass创建BeanSerializerModifier

 public class MyClassSerializerModifier extends BeanSerializerModifier { @Override public JsonSerializer modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer serializer) { if (beanDesc.getBeanClass() == MySpecificClass.class) { return new MyClassSerializer((JsonSerializer) serializer); } return serializer; } } 

注册序列化修饰符

 ObjectMapper om = new ObjectMapper() .registerModule(new SimpleModule() .setSerializerModifier(new MyClassSerializerModifier())); 
 @JsonSerialize(using = MyClassSerializer.class) public class MyClass { ... } public class MyClassSerializer extends JsonSerializer { @Override public void serialize(MyClass myClass, JsonGenerator generator, SerializerProvider provider) throws JsonGenerationException, IOException { if (myClass.getSomeProperty() == someCalculationResult) { provider.setAttribute("special", true); } provider.defaultSerializeValue(myClass, generator); } } 

如果你只是正常写一个对象使用上面的

如果这是您想要进行的唯一更改,则可以使用@JsonGetter而不是使用自定义序列化程序。

 public class MyClass{ @JsonGetter("special") protected boolean getSpecialForJackson() { return myClass.getSomeProperty() == someCalculationResult; } }