我有一个频率类,它接受一个属性类型,它告诉反序列化器在运行时解析的子类。
@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看起来像这样。
{"频率":{ "类型":"发病率&#34 ;, " frequencyType":"发病率" }}
type用于向json反序列化器提供元数据信息,frequencyType用于确定我们发送的子类信息。 我们可以将它浓缩为一个属性而不是两个属性吗?
答案 0 :(得分:0)
是的,可以做到。你需要两件事:
1 - 首先,您需要更改visible
中的@JsonTypeInfo
属性。这将允许保持反序列化的“类型”值。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type",
visible = true)
2 - 在您需要之后,Frequency中的字段与type属性具有相同的名称。
public abstract class Frequency {
private FrequencyType type;
public FrequencyType getType() {
return type;
}
public void setType(FrequencyType type) {
this.type = type;
}
就是这样,之后您可以发送{"type":"INCIDENCE"}
,Java对象将具有type = INCIDENCE。
答案 1 :(得分:0)
您可以将Jackson配置为在反序列化期间不删除type
字段。您可以通过设置visible参数来实现此目的。正如链接中的文档所说:
定义类型标识符值是作为JSON流的一部分传递给反序列化器(true),还是由TypeDeserializer处理和删除(false)
和
默认值为false,表示Jackson处理并从JSON内容中删除类型标识符
像这样配置@JsonTypeInfo
:
@JsonTypeInfo(use = Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type",
visible = true)
并确保您的类中有一个名为setType
的setter,Jackson将在反序列化期间使用类型JSON字段调用。