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

时间:2017-08-09 16:25:02

标签: java jackson deserialization

我有一个频率类,它接受一个属性类型,它告诉反序列化器在运行时解析的子类。

@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用于确定我们发送的子类信息。 我们可以将它浓缩为一个属性而不是两个属性吗?

2 个答案:

答案 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字段调用。