当前位置: 首页 > 面试题库 >

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

都建树
2023-03-14
问题内容

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

例如:

@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()));


 类似资料:
  • 我想创建一个自定义序列化程序,它只做一点点工作,然后将其余部分留给默认序列化。 例如: 通过为聚合对象创建其他自定义序列化器的想法,这些对象根据“特殊”属性值表现不同。然而,上面的代码不起作用,因为它毫不奇怪地进入了无限递归。 一旦我设置了属性,有没有办法告诉jackson使用默认序列化?我真的不想像许多自定义序列化程序那样枚举所有属性,因为该类相当复杂,并且我不想每次更改该类时都必须对序列化程序

  • 问题内容: 我需要设置班级日期序列化的格式。我有Jackson的版本,没有@JsonFormat。这就是为什么我编写自定义类的原因: } 并使用它: 但是,我还有另一个具有不同日期格式的字段,并且我不想创建用于序列化的其他类。我可以将所有需要的格式(例如常量)添加到CDJsonDateSerializer类中,并通过注释设置所需的格式吗?像这样: 。 下面的答案后: 经过一些更正后,它可以工作。我

  • 问题内容: 我想要的是对类的对象有条件地使用默认BeanSerializer: 我试图做这样的事情: 但这调用了MyCustomSerializer的方法,而且我永无止境地递归。如何获得可以用于普通bean序列化的适当的Serializer对象? 问题答案: 这需要更复杂的设置:您需要让Jackson创建一个,然后接管,而不是直接覆盖要使用的序列化器。这可以通过注册(via )方法来完成。将为您提

  • 有没有办法让Jackson序列化某个流对象(并在之后关闭)?这样地: 使现代化 澄清:我想流式传输内容,而不仅仅是将其序列化到单个String对象。

  • 假设我正在为某个类编写自定义序列化,但希望使用默认方法处理其中一个字段。 那要怎么做? 序列化时,我们有。 但反序列化的相应方法是什么? 请注意以下代码: 如何实现MyOuterDeserializer?

  • 我在Jackson的自定义反序列化程序中有一个问题。我想访问默认序列化程序来填充我要反序列化到的对象。在填充之后,我将执行一些自定义操作,但首先我要使用默认的Jackson行为反序列化对象。 这是我现在有的代码。 我需要的是一种初始化默认反序列化器的方法,这样我就可以在开始我的特殊逻辑之前预填充我的POJO。 当从自定义反序列化程序内调用deserialize时,无论我如何构造序列化程序类,该方法