【问题标题】:Error deserializing generic objects via jackson通过杰克逊反序列化通用对象时出错
【发布时间】:2017-11-16 12:09:32
【问题描述】:

我有以下 3 个课程:

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 中。

任何人都可以建议该怎么做?

【问题讨论】:

  • 这样的1.19版本好像不存在。你的意思是 1.9.1 吗?
  • 是 - 抱歉 - 1.9.2

标签: java generics serialization jackson deserialization


【解决方案1】:

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

这里有一个非泛型类Class1 扩展了具有BaseClass&lt;BasePerson&gt; 类型的泛型的情况。这就是我相信你会用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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2019-11-15
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多