基于Enum的Jackson多态反序列化

Cur*_*rro 23 java polymorphism json jackson

我正在使用JacksonPolymorphicDeserialization,这是我的代码,它反序列化为基于'type'属性的正确类:

@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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好,我的json根据'type'值变成了预期的类.

但是,我正在考虑将'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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

和Enum:

public enum EventType {
    SPECIAL_EVENT_1,
    SPECIAL_EVENT_2,
    EVENT;
}
Run Code Online (Sandbox Code Playgroud)

问题是第二种方法不起作用......任何想法为什么??? 我可以在这里使用Enum吗?

谢谢!

Cur*_*rro 18

固定!

它适用于杰克逊2.0 !!

  • 似乎在这种情况下,如果您不将可见控件设置为true,那么它将无法正常工作。...可以确认吗? (2认同)
  • 我可以确认“ visible”必须为“ true”才能起作用。就我而言,我还使用了include = JsonTypeInfo.As.EXISTING_PROPERTY来避免该属性在序列化过程中出现两次。 (2认同)
  • 那么使用枚举值“EventType.SPECIAL_EVENT_1”而不是字符串怎么样?是否可以? (2认同)

Sou*_*KMD 9

它对我来说使用枚举具有以下功能:

@JsonTypeInfo(  
    use = JsonTypeInfo.Id.NAME,  
    include = JsonTypeInfo.As.EXISTING_PROPERTY,  
    property = "type",
    visible = true
) 
Run Code Online (Sandbox Code Playgroud)