杰克逊自定义反序列化模块来抽象类

时间:2015-01-14 17:39:18

标签: spring-mvc jackson jackson-modules

我有一大组类(比较多100个),它们都是从一些抽象类扩展而来的,我们称它为ParentClass。让我们调用子类ChildAChildB等。如何为所有子项注册自定义反序列化器并在我的反序列化器中获取类类型? 我试过了:

module.addDeserializer(ParentClass.class, new MyObjectDeserializer());

但它不起作用。

我想跳过(工作正常):

module.addDeserializer(ChildA.class, new MyObjectDeserializer(ChildA.class));
module.addDeserializer(ChildB.class, new MyObjectDeserializer(ChildB.class));
module.addDeserializer(ChildC.class, new MyObjectDeserializer(ChildC.class));
//etc......

类类型应该是已知的,因为我使用Jackson作为spring @RequestBody方法,那里定义了类名。 任何想法如何做到这一点?

1 个答案:

答案 0 :(得分:1)

据我所知,我认为杰克逊有一种机制可以解决您的确切需求。

但是,您可以尝试一些替代方案。 Deserializing polymorphic types with Jackson描述了一个这样的替代方案,但是,您仍然需要明确定义所有支持的子类型。

另一个不需要您显式定义反序列化关系的替代方法是将类层次结构从继承更改为容器的层次结构。

例如,将抽象父类转换为如下容器:

public class DataContainer<T> {
  String commonString;
  Integer commonInteger;  

  T subData;
}

允许您在控制器中简单地定义输入函数

public String controllerFunction(DataContainer<ClassA> classA);

无需定义所有这些子类反序列化。