【发布时间】:2018-02-03 15:07:32
【问题描述】:
我有一个表示各种有限域值的类(类似于枚举):
public abstract class AbstractEnum {
private String id;
// ...
}
具体类 EnumA, EnumB 扩展 AbstractEnum。
业务对象可能看起来像
public class Obj {
private EnumA a;
private EnumB b;
// ...
}
EnumA, EnumB 的实例由工厂管理。在反序列化Obj 时,我想调用工厂而不是构造函数。具体类型(EnumA 或 EnumB)无法从枚举值的 JSON 表示中推断出来,因为它们只包含它们的 ID,而是从 Obj 中的相应属性类型推断出来的。
我尝试在AbstractEnum 上使用@JsonCreator 或@JsonDeserialize(带转换器),但创建者/转换器似乎无法使用该属性类型。似乎我必须使用@JsonTypeInfo 来序列化额外的类型信息(这似乎是多余的),或者为每个具体的AbstractEnum 子类定义一个创建者/转换器,其中不止两个。
还有其他方法吗?
编辑:EnumA 的实例可以与EnumB 的实例具有相同的 ID,因此该 ID 不能用于推断类型。
【问题讨论】:
-
您应该为
AbstractEnum实现自定义JsonDeserializer。在里面你可以使用你的工厂。 -
因为
EnumA和EnumB在Obj中有自己的变量名,那么JSON序列化应该能够判断字段a和字段b是否存在.基本上字段名(也就是变量名)会区分它们。