Дезериализатор Джексона - ключ ввода: пары значений, если их нет в сериализованных данных - PullRequest
0 голосов
/ 22 октября 2019

Я сохраняю полезную нагрузку событий в виде строки json в базу данных. Чтобы иметь только одну версию событий в коде, в то же время имея возможность читать старые события, я хочу «выгружать» сериализованные данные перед десериализацией.

Я думал о чем-то подобном

public Object deserialize(String data, Class<?> clazz) throws IOException {
    data = upcaster.upcast(data, clazz);
    return objectMapper.readValue(data, clazz);
}

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

Есть ли способ настроить Джексона между созданием объекта json и созданием объекта моего события?

Что-то вроде:

@override
updateData(clazz, jsonData) {
    if(clazz.equals(SpecificEvent.class)) {
        if(!jsonData.containsKey("addedInfo")) {
            jsonData.put("addedInfo", "foo");
        }
    }
}

В качестве альтернативы я мог бы добавить свой собственный десериализатор, который изменяет данные json перед вызовом стандартного десериализатора, я думаю?!

Какой нормальный способ сделать что-то подобное с Джексоном?

1 Ответ

0 голосов
/ 22 октября 2019

Один из вариантов - настраиваемая десериализация с выделенным классом десериализации (для вашего собственного класса). Затем вам нужно будет поддерживать класс десериализатора, чтобы убедиться, что он предоставляет недостающие данные.

Он должен работать для нескольких классов, если у вас их много, то могут быть лучшие способы.

...