基于枚举的Jackson多态反序列化

42

我正在使用Jackson多态反序列化,这是我的代码,根据"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;
    }   
}

它正常工作,我的json根据“type”值转换为预期的类。

然而,我正在考虑将“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 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;
}

问题在于第二种方法不起作用...有任何想法为什么???我可以在这里使用枚举吗???
谢谢!
2个回答

27

已修正!

它能够与jackson 2.0一起使用!


4
看起来如果在这种情况下不将 visible 设为 true,它就无法正常工作……你能确认一下吗? - Maxrunner
9
我能确认visible需要是true才能生效。在我的情况下,我还使用了include=JsonTypeInfo.As.EXISTING_PROPERTY,以避免属性在序列化过程中出现两次。 - Wim Deblauwe
感谢 visible=true。枚举类型完美运行 :) - user2340345
4
使用枚举值EventType.SPECIAL_EVENT_1代替字符串,这可行吗? - PhoneixS
1
@PhoneixS 不可以,因为名称必须是一个常量。 - toucheqt

9

我使用以下枚举值成功实现:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接