java - 如何在不覆盖序列化方法的情况下为特定类覆盖 JsonSerializer 的 isEmpty 方法?

标签 java json spring serialization jackson

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

当我从 JsonSerializer<MySpecificClass> 延伸时

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

我想保留序列化方法,只覆盖 isEmpty 方法。

最佳答案

为了修改 isEmpty 行为但保持默认序列化,您可以利用 serializer 修饰符。您仍然需要实现自定义序列化程序,但您可以非常干净地利用默认序列化。

使用注入(inject)的默认序列化器创建自定义序列化器

defaultSerializer 变量注入(inject)到您的自定义序列化程序类中。当我们实现修饰符时,你会看到这个序列化器是从哪里来的。在此类中,您将覆盖 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()));

关于java - 如何在不覆盖序列化方法的情况下为特定类覆盖 JsonSerializer 的 isEmpty 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31025046/

相关文章:

java - 访问远程服务器时 MySQL 连接出错

mysql - 在 Express 中使用带有 Json 的 MySQL 查询

Javascript Json对象,通过Key String按值获取.. Ex : GetMyVal(MyKeyInString)

JSON Unicode转义序列-是否小写?

java - 使用 MYSQL 8 通过 JDBC 语句执行 DDL 时出错

java - 使用 TestNG 测试数据库不回滚

java - 带有 MySQL 数据库的 spring-data-elasticsearch

java - Hibernate 4 字节码增强不适用于脏检查优化

java - 对象在 Java 的构造函数中转义总是一个问题吗?

Java --- 用年历更新数据库