如何在反序列化期间获取多态类的java代码中@JsonTypeInfo中定义的属性?
我有一个frequency类,它接受一个属性类型,告诉反序列化程序在运行时解析哪个子类如何在反序列化期间获取多态类的java代码中@JsonTypeInfo中定义的属性?,java,jackson,deserialization,Java,Jackson,Deserialization,我有一个frequency类,它接受一个属性类型,告诉反序列化程序在运行时解析哪个子类 @JsonTypeInfo(use = Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @Type(value = FrequencyIncidence.class, name= "INCIDENCE"), @Type(value = FrequencyRange.c
@JsonTypeInfo(use = Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = FrequencyIncidence.class, name= "INCIDENCE"),
@Type(value = FrequencyRange.class, name="RANGE"),
})
public abstract class Frequency extends Audit {
private FrequencyType frequencyType;
public FrequencyType getFrequencyType() {
return frequencyType;
}
public void setFrequencyType(FrequencyType frequencyType) {
this.frequencyType = frequencyType;
}
是否有任何方法可以访问java代码中的属性类型,从而不必在java类中定义另一个字段frequencyType?
现在我需要frequencyType字段来确定java代码中的子类,并在java服务类中填充数据库中的数据。我的频率的json如下所示
{“频率”:{
“类型”:“发生率”,
“频率类型”:“发生率”}
type用于向json反序列化程序提供元数据信息,frequencyType用于确定我们发送的子类信息。
我们能把它压缩成一个属性而不是两个吗?是的,可以做到。你需要两件事: 1-首先,您需要更改
@JsonTypeInfo
中的visible
属性。这将允许保留反序列化的“type”值
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type",
visible = true)
2-之后,您需要频率中的字段与类型属性具有相同的名称
public abstract class Frequency {
private FrequencyType type;
public FrequencyType getType() {
return type;
}
public void setType(FrequencyType type) {
this.type = type;
}
也就是说,在这之后,您可以发送
{“type”:“incident”}
,Java对象的type=incident 您可以将Jackson配置为在反序列化期间不删除类型
字段。您可以通过设置参数来实现这一点。正如链接中的文档所说:
定义类型标识符值是作为JSON流的一部分传递给反序列化程序(true),还是由类型反序列化程序处理和删除(false)
及
默认值为false,表示Jackson处理并从JSON内容中删除类型标识符
如下所示配置@JsonTypeInfo
:
@JsonTypeInfo(use = Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type",
visible = true)
并确保在类中有一个名为setType
的setter,Jackson将在使用类型JSON字段进行反序列化时调用该setter