Я разрабатываю интерфейс REST для своего приложения, используя Jackson для сериализации объектов домена POJO для представления JSON. Я хочу настроить сериализацию для некоторых типов для добавления дополнительных свойств в представление JSON, которые не существуют в POJO (например, добавить некоторые метаданные, справочные данные и т.д.). Я знаю, как написать свой собственный JsonSerializer
, но в этом случае мне нужно было бы явно вызвать методы JsonGenerator.writeXXX(..)
для свойства each для моего объекта, тогда как все, что мне нужно, это просто добавить дополнительное свойство. Другими словами, я хотел бы написать что-то вроде:
@Override
public void serialize(TaxonomyNode value, JsonGenerator jgen, SerializerProvider provider) {
jgen.writeStartObject();
jgen.writeAllFields(value); // <-- The method I'd like to have
jgen.writeObjectField("my_extra_field", "some data");
jgen.writeEndObject();
}
или (еще лучше), чтобы как-то перехватить сериализацию перед вызовом jgen.writeEndObject()
, например:
@Override void beforeEndObject(....) {
jgen.writeObjectField("my_extra_field", "some data");
}
Я думал, что могу расширить BeanSerializer
и переопределить его метод serialize(..)
, но объявил final
, а также не смог найти простой способ создать новый экземпляр BeanSerializer
, не предоставив его всем типом детали метаданных практически дублируют хорошую часть Джексона. Поэтому я отказался от этого.
Мой вопрос - как настроить сериализацию Джексона, чтобы добавить дополнительный материал к выходу JSON для конкретных POJO, не внося слишком много кода шаблона и повторно используя максимально возможное поведение Джексона по умолчанию.