Jackson - 使用整数字段序列化/反序列化枚举

时间:2018-02-21 08:31:37

标签: java json enums jackson

这里有一个非常相似的问题 - 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。添加@JsonValue注释仅在序列化的情况下有用,并且无法进行反序列化。如果我们没有字段,意味着GOOD = 0,BAD = 1,UGLY = 2,@JsonValue就足够了,杰克逊在字段存在时无法反序列化 - 错误的映射为0和1,异常为-1。

2 个答案:

答案 0 :(得分:4)

这可以使用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();
    }

}

注意:这是目前杰克逊图书馆的一个漏洞 - https://github.com/FasterXML/jackson-databind/issues/1850

答案 1 :(得分:0)

我在其他解决方案上遇到了问题。这对我有用(Jackson 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; }
}