如何在不重写serialize方法的情况下覆盖特定类的JsonSerializer的isEmpty方法?

我想为isEmpty方法添加自定义行为。

当我从JsonSerializer扩展时

我应该覆盖serialize方法,因为它是抽象的。

我想按原样保留serialize方法并仅覆盖isEmpty方法。

为了修改isEmpty行为但保持默认序列化,您可以利用序列化程序修饰符 。 您仍然需要实现自定义序列化程序,但您可以非常干净地利用默认序列化。

使用注入的默认序列化程序创建自定义序列化程序

defaultSerializer变量注入自定义序列化程序类。 我们将在实现修饰符时看到此序列化程序的来源。 在这个类中,您将覆盖isEmpty方法以完成您的需要。 下面,如果MySpecificClass具有空id ,则Jackson认为它是空的。

 public class MySpecificClassSerializer extends JsonSerializer { private final JsonSerializer defaultSerializer; public MySpecificClassSerializer(JsonSerializer defaultSerializer) { this.defaultSerializer = checkNotNull(defaultSerializer); } @Override public void serialize(MySpecificClass value, JsonGenerator gen, SerializerProvider serializers) throws IOException { defaultSerializer.serialize(value, gen, serializers); } @Override public boolean isEmpty(SerializerProvider provider, MySpecificClass value) { return value.id == null; } } 

创建自定义BeanSerializerModifier

扩展BeanSerializerModifier并覆盖modifySerializer方法。 在此方法内部,您可以筛选要操作的类类型,并相应地返回自定义序列化程序。

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

使用ObjectMapper注册修改器

注册修饰符将允许序列化程序在满足modifySerializer的条件时触发。

 ObjectMapper om = new ObjectMapper() .registerModule(new SimpleModule() .setSerializerModifier(new MyClassSerializerModifier())); 

最后,你无论如何都必须有serialize方法的实现,因为它是抽象的。 如果至少有一个方法是抽象的,则无法实例化您的类