我想为 isEmpty 方法添加自定义行为。
当我从JsonSerializer<MySpecificClass>
我应该覆盖serialize方法,因为它是抽象的。
我想按原样保留serialize方法,只覆盖isEmpty方法。
答案 0 :(得分:2)
为了修改isEmpty
行为但保持默认序列化,您可以利用序列化修饰符。您仍然需要实现自定义序列化程序,但您可以非常干净地使用默认序列化。
将defaultSerializer
变量注入自定义序列化程序类。我们将在实现修饰符时看到此序列化程序的来源。在本课程中,您将覆盖isEmpty
方法以完成您的需要。下面,如果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
方法。在此方法中,您可以过滤要操作的类类型,并相应地返回自定义序列化程序。
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()));
答案 1 :(得分:0)
最后,你无论如何都必须拥有serialize方法的实现,因为它是抽象的。如果至少有一个方法是抽象的
,则无法实例化您的类