如何在反序列化期间获取多态类的java代码中@JsonTypeInfo中定义的属性?

如何在反序列化期间获取多态类的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

我有一个frequency类,它接受一个属性类型,告诉反序列化程序在运行时解析哪个子类

@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