Джексон: десериализовать в другой тип - PullRequest
0 голосов
/ 06 апреля 2020

Я знаю, что подобный вопрос уже существует ( Джексон - десериализация в другой тип ), но ответ там не помогает мне. Старые JSON файлы уже находятся в производстве и не могут быть изменены.

У меня есть обычное приложение со старыми POJO. Теперь у меня есть новые POJO и в настоящее время для поддержки старых файлов, которые я десериализирую в старые POJO и конвертирую вручную в новые. Я хотел бы написать преобразование непосредственно в десериализатор Джексона, но у меня возникли проблемы. В прошлом я написал простой модуль Джексона для сериализации и десериализации определенных типов, и у меня есть некоторые базовые c знания о Джексоне.

У меня есть что-то вроде:

public class MyModule extends com.fasterxml.jackson.databind.module.SimpleModule

  public MyModule() {
    super("MyModule", Version.unknownVersion());

    addDeserializer(OldPojo.class, new JsonDeserializer<NewPojo>() {
      @Override
      public NewPojo deserialize(JsonParser p, DeserializationContext ctxt) {
        // convert and return new pojo
      }
    }

    // others deserializers ...
  }
}

Было бы это подход возможен? И что я делаю не так? Большое спасибо.

1 Ответ

0 голосов
/ 06 апреля 2020

Документация для `SimpleModule.addDeserializer () дает подпись для этого метода следующим образом:

public <T> SimpleModule addDeserializer(Class<T> type, JsonDeserializer<? extends T> deser)

, где <T> - это тип возвращаемого значения JsonDeserializer.deserialize() (нормально , <? extends T> это тот тип…).

Таким образом, в вашем случае вы должны иметь возможность преобразовать экземпляр NewPojo в ссылку OldPojo:

NewPojo o = new NewPojo();
OldPojo r = (OldPojo) o;

Если это работает без ClassCastException, ваш подход может быть успешным…

Вы сказали, что не можете изменить файлы JSON - но нужно ли вам также сохранять класс OldPojo? Почему

…
addDeserializer( **NewPojo.class**, new JsonDeserializer<NewPojo>() )
{
    …

у вас не работает?

...