【问题标题】:Jackson: deserialize to different type杰克逊:反序列化为不同的类型
【发布时间】:2020-04-06 09:11:44
【问题描述】:

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

我有一个使用旧 POJO 的常规应用程序。现在我有了新的 POJO,目前为了支持旧文件,我将反序列化为旧的 POJO 并手动转换为新的。我想将转换直接写入杰克逊反序列化器,但我遇到了麻烦。过去我写过一个简单的 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 ...
  }
}

这种方法可行吗?我做错了什么?非常感谢。

【问题讨论】:

  • OldPojoNewPojo 有什么区别? Old JSON payloadNew JSON payload 有什么区别?
  • 许多不同之处。例如,一些引文 POJO 现在可能有多个作者,而不是以前是一个字符串的单个作者。新的 POJO 也可能具有或多或少的属性或使用新的 3rd 方库作为本地日期。
  • 它会起作用的。你得到什么类型的错误?
  • 我终于搞定了!我刚刚为主要的 POJO 创建了一些反序列化器,并从那里处理了 JsonNode。我跟着stackoverflow.com/questions/18313323/… 的第二个回答。一个问题是对新的 POJO 使用原始序列化程序,而我刚刚制作了一个原始映射器。我想学习如何改用默认的序列化程序。解决方法:github.com/SiLeBAT/FSK-Lab/blob/emf_jackson/…

标签: java json jackson jackson-databind


【解决方案1】:

documentation for `SimpleModule.addDeserializer() 给出了该方法的签名,如下所示:

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

其中&lt;T&gt;JsonDeserializer.deserialize() 的返回类型(好吧,&lt;? extends T&gt; 是那个类型……)。

因此,在您的情况下,您必须能够将 NewPojo 实例转换为 OldPojo 引用:

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

如果没有ClassCastException 也可以,那么你的方法可能会成功……

您说您不能更改 JSON 文件 - 但您是否也必须保留 OldPojo 类?为什么

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

不适合你?

【讨论】:

  • 没有。我不能将 NewPojo (o) 转换为 OldPojo,因为它们是不同的类。 NewPojo 没有扩展 OldPojo。关于 addDeserializer,我认为 T 是委托类型。只会拾取 T 个对象(NewPojo)。无论如何,我目前正在尝试使用 JsonDeserialize(converter = SomeConverter.class) 编辑旧的 POJO 类,并且我在 logicbig.com/tutorials/misc/jackson/… 中为每个 POJO 使用一个转换器。我读过转换器可以直接与 StdDelegatingDeserializer 一起使用,但我找不到一个简单的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 2016-11-11
  • 2012-12-22
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多