如何在自定义序列化程序中访问默认的jackson序列化
我想创建一个自定义序列化程序,它可以完成一些工作,然后将其余部分用于默认序列化。
例如:
@JsonSerialize(using = MyClassSerializer.class) public class MyClass { ... } public class MyClassSerializer extends JsonSerializer { @Override public void serialize(MyClass myClass, JsonGenerator generator, SerializerProvider provider) throws JsonGenerationException, IOException { if (myClass.getSomeProperty() == someCalculationResult) { provider.setAttribute("special", true); } generator.writeObject(myClass); } }
有了为聚合对象创建其他自定义序列化程序的想法,这些对象基于’speical’属性值表现不同。 但是,上面的代码不起作用,因为毫不奇怪的是进入无限递归。
有没有办法告诉jackson在设置属性后使用默认序列化? 我真的不想枚举像许多自定义序列化程序一样的所有属性,因为类相当复杂,我不想每次更改类时都要对序列化程序进行双重维护。
BeanSerializerModifier
将为您提供对默认序列化的访问。
将默认序列化程序注入自定义序列化程序
public class MyClassSerializer extends JsonSerializer { private final JsonSerializer
为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) serializer); } return serializer; } }
注册序列化修饰符
ObjectMapper om = new ObjectMapper() .registerModule(new SimpleModule() .setSerializerModifier(new MyClassSerializerModifier()));
@JsonSerialize(using = MyClassSerializer.class) public class MyClass { ... } public class MyClassSerializer extends JsonSerializer { @Override public void serialize(MyClass myClass, JsonGenerator generator, SerializerProvider provider) throws JsonGenerationException, IOException { if (myClass.getSomeProperty() == someCalculationResult) { provider.setAttribute("special", true); } provider.defaultSerializeValue(myClass, generator); } }
如果你只是正常写一个对象使用上面的
如果这是您想要进行的唯一更改,则可以使用@JsonGetter而不是使用自定义序列化程序。
public class MyClass{ @JsonGetter("special") protected boolean getSpecialForJackson() { return myClass.getSomeProperty() == someCalculationResult; } }
- Java to Jackson JSON序列化:Money字段
- java.io.IOException:尝试从封闭流中读取
- 为什么jackson2不承认第一个大写字母,如果领先的骆驼案例字只有一个字母长?
- Jackson2ObjectMapperBuilder启用字段可见性ANY
- 如何通过jackson的注释定义通用列表反序列化器?
- Jackson JSON在序列化之前修改对象
- 使用Jackson Mixins和MappingJacksonHttpMessageConverter和Spring MVC
- 使用Jackson反序列化非字符串映射键
- Spring REST,JSON“无法处理托管/后向引用’defaultReference’”415不支持的媒体类型