小编典典

如何覆盖特定类的JsonSerializer的isEmpty方法而不覆盖序列化方法?

json

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

当我从 JsonSerializer<MySpecificClass>

我应该重写序列化方法,因为它是抽象的。

我想按原样保留序列化方法,并仅覆盖isEmpty方法。


阅读 326

收藏
2020-07-27

共1个答案

小编典典

为了修改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()));
2020-07-27