我将翻译与此相关的许多问题,但我无法找到这个确切的用例。
这里的假设是我正在使用Java Jackson库。
我有以下类层次结构:
public class Event {
@JsonProperty("si")
String sessionId;
@JsonProperty("eventType")
String eventType;
...
}
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class InitEvent extends Event
{
@JsonProperty("pm")
Params params;
public Params getParams()
{
return params;
}
.....
}
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class RecoEvent extends Event
{
@JsonProperty("ti")
String targetId;
@JsonProperty("tt")
int targetType;
public String getTargetId()
{
return targetId;
}
....
}
反序列化的规则如下:
如果eventType == 0,则反序列化为InitEvent
如果eventType == 1,则反序列化为RecoEvent
由于Jackson反序列化不知道要使用哪个类进行反序列化,因此默认情况下无法正常工作。解决方法之一是在基类上执行以下操作:
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)
public class Event
这个解决方案的问题在于它假定客户端将使用相同的mapper进行序列化,因为现在JSON中需要存在@class元素。
但是我的客户端不会在传入JSON中发送额外的@class元素。
需要什么解决方案?
我如何编写自定义反序列化程序来基于eventType值选择正确的派生类?
提前感谢。