gpt4 book ai didi

java - 如何在自定义序列化程序中访问默认 jackson 序列化

转载 作者:IT老高 更新时间:2023-10-28 20:52:21 27 4
gpt4 key购买 nike

我想创建一个自定义序列化程序,它只做一点工作,然后将其余部分留给默认序列化。

例如:

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

考虑为聚合对象创建其他自定义序列化程序,这些对象根据“特殊”属性值表现不同。但是,上面的代码不起作用,因为它毫无疑问地进入了无限递归。

一旦我设置了属性,有没有办法告诉 jackson 使用默认序列化?我真的不想像许多自定义序列化程序那样枚举所有属性,因为该类相当复杂,而且我不想每次更改类时都对序列化程序进行双重维护。

最佳答案

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

将默认序列化程序注入(inject)自定义序列化程序

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);
}
}

MyClass

创建一个 BeanSerializerModifier
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()));

关于java - 如何在自定义序列化程序中访问默认 jackson 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31056215/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com