簡體   English   中英

Jackson - 使用整數字段序列化/反序列化枚舉

[英]Jackson - Serialize / Deserialize Enums with Integer fields

這里有一個非常相似的問題 - Jackson: Serialize and deserialize enum values as integers處理使用 Jackson 序列化和反序列化枚舉,其解決方案通過使用@JsonValue注釋非常簡單。

如果我們有一個帶有如下整數字段的枚舉,這將不起作用。

enum State{
    GOOD(1), BAD(-1), UGLY(0);

    int id;

    State(int id) {
        this.id = id;
    }
}

如果我們的要求是序列化並提供實際值而不是name() 比如說,像{"name":"foo","state":1}代表 foo 的 GOOD。 添加@JsonValue注釋僅在序列化和反序列化失敗的情況下才有幫助。 如果我們沒有字段,這意味着 GOOD=0、BAD=1、UGLY=2、 @JsonValue就足夠了,並且當字段存在時 Jackson 無法反序列化 - 0 和 1 的映射錯誤,-1 的異常。

這可以使用 Jackson 注釋@JsonCreator來實現。 序列化,具有方法@JsonValue可以返回int和反序列化,一個static與方法@JsonCreator如下面提供可以接受參數的int。

以下代碼供參考:

enum State{
    GOOD(1), BAD(-1), UGLY(0);

    int id;

    State(int id) {
        this.id = id;
    }

    @JsonValue
    int getId() {
        return id;
    }

    @JsonCreator
    static State fromId(int id){
        return Stream.of(State.values()).filter(state -> state.id == id).findFirst().get();
    }

}

注意:這是 Jackson 庫上的一個開放錯誤 - https://github.com/FasterXML/jackson-databind/issues/1850

我在使用其他解決方案時遇到了問題。 這對我有用(傑克遜 2.9.9):

@JsonFormat(shape = JsonFormat.Shape.OBJECT)
enum State{
    GOOD(1), BAD(-1), UGLY(0);

    int id;

    State(int id) {
        this.id = id;
    }

    @JsonValue
    int getId() { return id; }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM