为了修改
isEmpty行为但保持默认的序列化,您可以利用 serializer修饰符
。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。
使用默认的序列化器创建一个自定义序列化器
将
defaultSerializer变量插入到您的自定义序列化器类中。当我们实现修饰符时,您将看到此序列化器的来源。在此类中,您将重写该
isEmpty方法以完成所需的操作。在下面,如果
MySpecificClass为空
id,则Jackson认为它为空。
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方法。在此方法内,您可以筛选要操作的类类型,并相应地返回自定义序列化程序。
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()));



