сериализатор Джексона: получить сериализованный объект

У меня проблема с сериализатором, вот моя проблема:

У меня есть такой класс bean:

@JsonSerialize(using = MyObjectSerializer.class)
public class MyObject {
    public int a;
    public boolean b;
}

При сериализации через Джексон без аннотации @ JsonSerialize я, очевидно, получаю:

{ "a": 42, "b": true}

Но мне нужно добавить свойство, чтобы оно давало:

{ "a": 42, "b": true, "version": "0.1-beta" }

(Это пример, в реальном мире добавляемое свойство зависит от нескольких свойств объекта)

Поэтому мне нужно написать собственный сериализатор. Однако в моем реальном коде класс содержит гораздо больше свойств, чем просто 2. Поэтому я не хочу вручную создавать эти свойства для объекта json ...

Если я использую это:

public static class MyObjectSerializer extends JsonSerializer<MyObject> {
    @Override public void serialize(MyObject obj, JsonGenerator json, SerializerProvider provider) throws IOException, JsonProcessingException {
        json.writeObject(obj);
    }
}

Очевидно, я получаю StackOverflowError.

Итак, вопрос может быть таким:

  • Как изнутри JsonSerializer я могу сериализовать объект без повторного вызова самого сериализатора?

or

  • Как я могу динамически добавлять свойства к сериализуемому объекту.

Раньше я делал это все время с GSon, но Джексон предоставляет множество функций, которые я хотел бы использовать;)


person Salomon BRYS    schedule 30.05.2012    source источник


Ответы (1)


Я почти уверен, что в вашем примере getVersion() будет достаточно геттера без свойства поддержки, в котором вы бы сгенерировали 0.1-beta. (или сгенерируйте значение на основе значений пары свойств, как вы описываете).

Поэтому нет необходимости в настраиваемом сериализаторе только для этой цели

person Geert-Jan    schedule 31.05.2012