如何在自定义序列化程序中访问默认的杰克逊序列化

DavidA:

我想创建一个自定义的序列化程序,该工作量很小,然后将其余的保留给默认序列化。

例如:

@JsonSerialize(using = MyClassSerializer.class)
public class MyClass {
  ...
}

public class MyClassSerializer extends JsonSerializer<MyClass> {
    @Override
    public void serialize(MyClass myClass, JsonGenerator generator, 
                          SerializerProvider provider) 
            throws JsonGenerationException, IOException {
        if (myClass.getSomeProperty() == someCalculationResult) {
            provider.setAttribute("special", true);
        }
        generator.writeObject(myClass);
    }  
}

基于为聚合对象创建其他自定义序列化程序的想法,这些对象的行为基于“特殊”属性值而有所不同。但是,上面的代码不起作用,因为毫无疑问,它进行了无限递归。

设置属性后,是否可以告诉杰克逊使用默认序列化?我真的不希望像许多自定义序列化程序一样枚举所有属性,因为该类相当复杂,并且我不想每次更改类时都必须对序列化程序进行双重维护。

山姆·贝瑞:

A BeanSerializerModifier将提供您访问默认序列化的权限。

将默认的序列化程序注入到自定义序列化程序中

public class MyClassSerializer extends JsonSerializer<MyClass> {
    private final JsonSerializer<Object> defaultSerializer;

    public MyClassSerializer(JsonSerializer<Object> defaultSerializer) {
        this.defaultSerializer = checkNotNull(defaultSerializer);
    }

    @Override
    public void serialize(MyClass myclass, JsonGenerator gen, SerializerProvider provider) throws IOException {
        if (myclass.getSomeProperty() == true) {
            provider.setAttribute("special", true);
        }
        defaultSerializer.serialize(myclass, gen, provider);
    }
}

创建BeanSerializerModifierMyClass

public class MyClassSerializerModifier extends BeanSerializerModifier {
    @Override
    public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
        if (beanDesc.getBeanClass() == MySpecificClass.class) {
            return new MyClassSerializer((JsonSerializer<Object>) serializer);
        }
        return serializer;
    }
}

注册序列化修饰符

ObjectMapper om = new ObjectMapper()
        .registerModule(new SimpleModule()
                .setSerializerModifier(new MyClassSerializerModifier()));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在杰克逊中编写自定义属性反序列化器

杰克逊自定义序列化对象

杰克逊(Jackson)如何在自定义序列化器/反序列化器中检索父bean

杰克逊自定义序列化和反序列化

使用杰克逊可自定义序列化和反序列化

如何自定义序列化杰克逊日期,@JsonSerialize不工作

杰克逊:如何反序列化嵌套的自定义地图和列表?

杰克逊自定义反序列化器无法在春季启动中工作

杰克逊:反序列化的自定义XML中的属性POJO

杰克逊反序列化不是在自定义解串器调用反序列化

在自定义序列化器杰克逊内部配置objectmapper?

自定义JSON序列化从Java科特林元杰克逊

使用杰克逊的对象数组的自定义序列化器

杰克逊:反序列化map <String,Object>到自定义嵌套Pojo

具有自定义条件的杰克逊多态反序列化

杰克逊自定义日期序列化器

杰克逊将地图序列化到自定义输出列表

杰克逊自定义序列化器JSON格式

杰克逊反序列化:自定义对象工厂

杰克逊自定义序列化程序:将对象更改为简单的属性和包含对象的值

如何在杰克逊中反序列化抽象类

杰克逊在@ManyToMany关系中序列化问题

杰克逊使用自定义日期格式错误地反序列化Joda日期

无需编写自定义序列化器和/或反序列化器,即可对第三方类进行杰克逊序列化和反序列化

我如何使杰克逊不使用默认值序列化图元

使用杰克逊将自定义反序列化类添加到已经存在的@JsonDeserialize批注中

是否可以在自定义序列化程序中序列化为已知的默认格式?

如何在杰克逊反序列化OffsetDateTime时保留偏移量

杰克逊:如何在序列化期间对JsonNode进行后处理?