杰克逊:反序列化为其他类型

时间:2020-04-06 09:11:44

标签: java json jackson jackson-databind

我知道已经存在类似的问题(Jackson - Deserializing to a Different Type),但是那里的答案对我没有帮助。旧的JSON文件已在生产中,无法更改。

我有一个带有旧POJO的常规应用程序。现在,我有了新的POJO,目前支持将旧文件反序列化为旧的POJO,并手动转换为新的POJO。我想直接将转换写到Jackson解串器中,但是遇到了麻烦。过去,我编写了一个简单的Jackson系列模块,用于对某些类型进行序列化和反序列化,并且我对Jackson有了一些基本的了解。

我有类似的东西:

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 :(得分:0)

documentation for `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>() )
{
    …

不适合您吗?

相关问题