我知道已经存在类似的问题(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 ...
}
}
这种方法可行吗?我在做什么错呢?非常感谢。
答案 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>() )
{
…
不适合您吗?