我想创建一个自定义的序列化程序,该工作量很小,然后将其余的保留给默认序列化。
例如:
@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 将提供您访问默认序列化的权限。
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); } }
MyClass
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()));