如何在不重写serialize方法的情况下覆盖特定类的JsonSerializer的isEmpty方法?
我想为isEmpty方法添加自定义行为。
当我从JsonSerializer
扩展时
我应该覆盖serialize方法,因为它是抽象的。
我想按原样保留serialize方法并仅覆盖isEmpty方法。
为了修改isEmpty
行为但保持默认序列化,您可以利用序列化程序修饰符 。 您仍然需要实现自定义序列化程序,但您可以非常干净地利用默认序列化。
使用注入的默认序列化程序创建自定义序列化程序
将defaultSerializer
变量注入自定义序列化程序类。 我们将在实现修饰符时看到此序列化程序的来源。 在这个类中,您将覆盖isEmpty
方法以完成您的需要。 下面,如果MySpecificClass
具有空id
,则Jackson认为它是空的。
public class MySpecificClassSerializer extends JsonSerializer { private final JsonSerializer
创建自定义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方法的实现,因为它是抽象的。 如果至少有一个方法是抽象的,则无法实例化您的类