无类型信息子类的java反序列化
我有一个代表各种有限域值的类(类似于枚举):
public abstract class AbstractEnum {
private String id;
// ...
}
和具体类EnumA, EnumB
扩展AbstractEnum
。
业务对象可能看起来像
public class Obj {
private EnumA a;
private EnumB b;
// ...
}
EnumA, EnumB
的实例由工厂管理。当反序列化Obj
时,我想调用工厂而不是构造函数。无法从枚举值的JSON表示中推断具体类型(EnumA
或EnumB
),因为它们只包含它们的ID,而是从Obj
中相应的属性类型推断出来的
我尝试在AbstractEnum
上使用@JsonCreator
或@JsonDeserialize
(带转换器),但属性类型似乎无法供创建者/转换器使用。似乎我必须要么使用@JsonTypeInfo
来序列化额外的类型信息(这似乎是多余的),要么为每个具体的AbstractEnum
子类定义一个创建者/转换器,其中不仅仅有两个。
还有别的办法吗
编辑:EnumA
的实例可以与EnumB
的实例具有相同的ID,因此该ID不能用于推断类型
# 1 楼答案
在这种情况下,您可以使用字段名来区分类型,而不必依赖工厂或其他任何东西。这里我假设名为
a
的字段将始终引用类型EnumA
等等。下面是一些测试代码,它使用您的代码,并试图表明仅字段名就可以做到这一点这段代码的输出是
这表明JSON被正确反序列化