java - 通过 Jackson 反序列化通用对象时出错

标签 java generics serialization jackson deserialization

我有以下 3 个类(class):

public class BaseClass<T>{
   private List<T> someList;
   ... constructor.....
}

public class Class1 extends BaseClass<BasePerson>{ .. constructor.. } 

public class Class2 extends BaseClass<Person> { ... constructor... }

反序列化其中一个类(Class1 或 Class2)时出现以下错误:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.somepackage.BasePerson

我看到了一些关于此错误的答案,所有建议都使用 TypeReferenceTypeFactory 这里: answer 和这里 : another answer

我的问题是我使用的是 Jackson 旧版本 (1.9.2),无法升级到 2.0。 TypeReferenceTypeFactory 都是在 2.0.0 API 中添加的。

有人可以建议该怎么做吗?

最佳答案

这些类在 Jackson 1.9 中定义。相关文档 TypeFactoryTypeReference

这里有一个非泛型类的情况 Class1使用类型扩展泛型 BaseClass<BasePerson> 。我相信你会用 TypeFactory 来处理这个问题。

ObjectMapper mapper = new ObjectMapper();
TypeFactory typeFactory = mapper.getTypeFactory();
JavaType baseType = typeFactory.constructParametricType(BaseClass.class, BasePerson.class);
JavaType type = typeFactory.constructSpecializedType(baseType, Class1.class);

并像这样反序列化:

Class1 class1 = mapper.readValue(json, type);

关于java - 通过 Jackson 反序列化通用对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44543091/

相关文章:

java - 为什么返回泛型列表的 Java Stream 不起作用

wpf - 无法序列化泛型类型 'System.Windows.FreezableCollection`

java - 使用非西方字符对字符串进行排序

java - 相当于 Java 中的 PHP 的 print_r?

c# - 接口(interface)的通用协方差 - "is"和 "="运算符之间奇怪的行为矛盾

java - 为什么这个泛型类型没有删除到指定的类

c# - 为什么 C# 使用 [System.Serializable] 来保存实例? (Unity3D)

c# - 将 System.Array 序列化为 XML 字符串

java - 获取 n 位 BigInteger 的最大值

java - 使用 Saxon-HE 检索 XSLT 2.0 中的 HashMap 值