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

Pav*_*mar 4 java enums json jackson

这里有一个非常相似的问题-Jackson:将枚举值序列化和反序列化为整数,这涉及使用Jackson来枚举和反序列化枚举,其解决方案通过使用@JsonValue批注非常简单。

如果我们有一个带有如下整数字段的枚举,则此方法不起作用。

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

    int id;

    State(int id) {
        this.id = id;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们的要求是序列化并提供实际值而不是name()。说,就像{"name":"foo","state":1}代表foo表示良好。@JsonValue仅在序列化的情况下添加注释才有帮助,反序列化失败。如果我们没有字段,则意味着GOOD = 0,BAD = 1,UGLY = 2 @JsonValue就足够了,并且当字段存在时Jackson不能反序列化-0和1的映射错误,-1的异常。

Pav*_*mar 7

这可以使用Jackson批注实现@JsonCreator。对于序列化,使用的方法@JsonValue可以返回int,对于反序列化,使用的static方法@JsonCreator可以接受int in参数,如下所示。

以下代码供参考:

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();
    }

}
Run Code Online (Sandbox Code Playgroud)

注意:这是Jackson库上的一个打开的错误-https: //github.com/FasterXML/jackson-databind/issues/1850