【问题标题】:Jackson Polymorphic Deserialization based on Enum基于 Enum 的 Jackson 多态反序列化
【发布时间】:2023-03-18 23:09:01
【问题描述】:

我正在使用JacksonPolymorphicDeserialization,这是我的代码,它根据“类型”属性反序列化为适当的类:

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "type",
    defaultImpl = Event.class, 
    visible = true)  
@JsonSubTypes({        
    @Type(value = SpecialEvent1.class, name = "SPECIAL_EVENT_1"), 
    @Type(value = SpecialEvent2.class, name = "SPECIAL_EVENT_2"), 
    })  
public abstract class AbstractEvent {

    private String type;

    public String getType() {
    return type;
    }

    public void setType(String type) {
    this.type = type;
    }   
}

它工作得很好,我的 json 根据“类型”值变成了预期的类。

但是,我正在考虑将“type”属性从 String 移动到 Enum,这是我进行此更改后的新代码:

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.PROPERTY,  
    property = "type",
    defaultImpl = Event.class, 
    visible = true)  
@JsonSubTypes({        
    @Type(value = SpecialEvent1.class, name = "SPECIAL_EVENT_1"), 
    @Type(value = SpecialEvent2.class, name = "SPECIAL_EVENT_2"), 
    })  
public abstract class AbstractEvent {

    private EventType type;

    public EventType getType() {
    return type;
    }

    public void setType(EventType type) {
    this.type = type;
    }   
}

和枚举:

public enum EventType {
    SPECIAL_EVENT_1,
    SPECIAL_EVENT_2,
    EVENT;
}

问题是第二种方法不起作用......知道为什么吗?我可以在这里使用枚举吗???

谢谢!

【问题讨论】:

    标签: java json polymorphism jackson


    【解决方案1】:

    使用枚举对我有用:

    @JsonTypeInfo(  
        use = JsonTypeInfo.Id.NAME,  
        include = JsonTypeInfo.As.EXISTING_PROPERTY,  
        property = "type",
        visible = true
    ) 
    

    我在这里使用 com.fasterxml.jackson.annotation 来表示 Jackson Annotations。

    【讨论】:

      【解决方案2】:

      已修复!

      它适用于杰克逊 2.0!!

      【讨论】:

      • 在这种情况下,如果你不把可见性设置为真,它就行不通了....你能确认一下吗?
      • 我可以确认visible 必须是true 才能工作。在我的例子中,我还使用了include = JsonTypeInfo.As.EXISTING_PROPERTY 来避免该属性在序列化过程中出现两次。
      • 感谢可见=真。与枚举完美配合 :)
      • 那么使用枚举值EventType.SPECIAL_EVENT_1 而不是字符串呢?有可能吗?
      • @PhoneixS 否,因为名称必须是常量。
      猜你喜欢
      • 2018-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      相关资源
      最近更新 更多