如何覆盖特定类的JsonSerializer的isEmpty方法而不重写serialize方法?

时间:2015-06-24 11:14:34

标签: java json spring serialization jackson

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

当我从JsonSerializer<MySpecificClass>

延伸时

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

我想按原样保留serialize方法,只覆盖isEmpty方法。

2 个答案:

答案 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方法的实现,因为它是抽象的。如果至少有一个方法是抽象的

,则无法实例化您的类