我想为 isEmpty 方法添加自定义行为。
当我从 JsonSerializer<MySpecificClass>
JsonSerializer<MySpecificClass>
我应该重写序列化方法,因为它是抽象的。
我想按原样保留序列化方法,并仅覆盖isEmpty方法。
为了修改isEmpty行为但保持默认的序列化,您可以利用 serializer修饰符 。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。
isEmpty
将defaultSerializer变量插入到您的自定义序列化器类中。当我们实现修饰符时,您将看到此序列化器的来源。在此类中,您将重写该isEmpty方法以完成所需的操作。在下面,如果MySpecificClass为空id,则Jackson认为它为空。
defaultSerializer
MySpecificClass
id
public class MySpecificClassSerializer extends JsonSerializer<MySpecificClass> { private final JsonSerializer<Object> defaultSerializer; public MySpecificClassSerializer(JsonSerializer<Object> 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方法。在此方法内,您可以筛选要操作的类类型,并相应地返回自定义序列化程序。
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<Object>) serializer); } return serializer; } }
ObjectMapper
注册修饰符将允许您的序列化器在modifySerializer满足条件的任何时候触发。
ObjectMapper om = new ObjectMapper() .registerModule(new SimpleModule() .setSerializerModifier(new MyClassSerializerModifier()));