2

我有一大堆类(比如超过 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 方法,在那里定义了类名。任何想法如何做到这一点?

4

2 回答 2

1

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

但是,您可以尝试几种替代方法。 使用 Jackson 反序列化多态类型描述了一种这样的替代方法,但是,您仍然需要显式定义所有支持的子类型。

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

例如,将您的抽象父类转换为容器,如下所示:

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

  T subData;
}

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

public String controllerFunction(DataContainer<ClassA> classA);

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

于 2015-01-14T18:44:23.417 回答
0

聚会迟到了,但我遇到了类似的问题,我通过Deserializers在我的SimpleModule. 代码在其中,Kotlin但应该很容易将其移植到Java.

类本身:

class UseBaseClassSimpleDeserializers(
    private val baseClass: Class<*>,
    private val baseClassDeserializer: JsonDeserializer<*>
) : SimpleDeserializers() {
    @Throws(JsonMappingException::class)
    override fun findBeanDeserializer(
        type: JavaType?,
        config: DeserializationConfig?,
        beanDesc: BeanDescription?
    ): JsonDeserializer<*>? {
        val beanDeserializer = super.findBeanDeserializer(type, config, beanDesc)
        return if (beanDeserializer == null && baseClass.isAssignableFrom(type!!.rawClass)) {
            baseClassDeserializer
        } else {
            beanDeserializer
        }
    }
}

如何将自定义Deserializers类注册到SimpleModule

val simpleModule = SimpleModule()
simpleModule.setDeserializers(UseBaseClassSimpleDeserializers(ParentClass::class.java, ParentClassDeserializer()))
于 2022-02-02T06:20:47.087 回答