Как получить доступ к стандартной сериализации jackson в пользовательском сериализаторе
Я хочу создать собственный сериализатор, который выполняет небольшую работу, а затем оставляет остальное для сериализации по умолчанию.
Например:
@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);
}
}
С идеей создания других настраиваемых сериализаторов для агрегированных объектов, которые ведут себя по-разному на основе значения "speical". Однако приведенный выше код не работает, поскольку он неудивительно переходит в бесконечную рекурсию.
Есть ли способ сказать джексону использовать сериализацию по умолчанию, как только я установил атрибут? Я действительно не хочу перечислять все свойства, как многие пользовательские сериализаторы, поскольку класс довольно сложный, и я не хочу, чтобы каждый раз, когда я меняю класс, нужно выполнять двойное обслуживание с помощью сериализатора.
Ответы
Ответ 1
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);
}
}
Создайте BeanSerializerModifier
для 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()));
Ответ 2
@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);
}
serializerProvider.defaultSerializeValue(myClass, generator);
}
}
если вы просто пишете объект, как обычно, используйте приведенный выше