杰克逊:将枚举值序列化和反序列化为整数

时间:2016-06-15 11:01:39

标签: java json serialization enums jackson

考虑以下枚举和类:

Uri redirectUrl;
            switch (SharePointContextProvider.CheckRedirectionStatus(Context, out redirectUrl))
            {
                case RedirectionStatus.Ok:
                    return;
                case RedirectionStatus.ShouldRedirect:
                    Response.Redirect(redirectUrl.AbsoluteUri, endResponse: true);
                    break;
                case RedirectionStatus.CanNotRedirect:
                    Response.Write("An error occurred while processing your request.");
                    Response.End();
                    break;
            }

并考虑以下主要功能:

public enum State {
    ON,
    OFF,
    UNKNOWN
}

public class Machine {
    String name;
    int numCores;
    State state;

    public Machine(String name, int numCores, State state) {
        this.name = name;
        this.numCores = numCores;
        this.state = state;
    }
}

目前,这个主要的输出是:

public static void main(String args[]) {
    Machine m = new Machine("Machine 1", 8, OFF);
    ObjectMapper mapper = new ObjectMapper();
    String machineAsJsonString = mapper.writeValueAsString(m);
    System.out.println(machineAsJsonString);
}

这个输出对我不好,而不是{"name" : "Machine 1", "numCores" : 8, "state" : "OFF"} 的字符串"OFF",我希望它是state,这是{{1}的序数值在枚举1中。

所以我想得到的实际结果是:

OFF

是否有一些优雅的方式让它以这种方式运作?

6 个答案:

答案 0 :(得分:36)

它应该通过指定JsonValue映射器来工作。

public enum State {
    ON,
    OFF,
    UNKNOWN;

    @JsonValue
    public int toValue() {
        return ordinal();
    }
}  

这也适用于反序列化,如@JsonValue注释的Javadoc所述:

  

注意:当用于Java枚举时,一个附加功能就是该值   通过带注释的方法返回也被认为是值   反序列化,而不仅仅是要序列化为的JSON字符串。这是   可能因为Enum值的集合是恒定的并且可以   定义映射,但一般不能为POJO类型完成;如   这样,这不用于POJO反序列化

答案 1 :(得分:11)

您可以使用设置

objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_INDEX);

有关完整的测试用例,请参阅https://github.com/FasterXML/jackson-databind/blob/master/src/test/java/com/fasterxml/jackson/databind/ser/TestEnumSerialization.java

感谢https://righele.it/2016/01/30/jackson-deserialization-from-json-to-java-enums/

提示

答案 2 :(得分:2)

如果您要打印枚举的序号,可以更改构造函数以接受int而不是State,然后在调用Machine时,您可以在以下方式:

Machine m = new Machine("Machine 1", 8, State.OFF.ordinal());

这将获得传入状态的枚举序号值并打印以下内容

{name='Machine 1', numCores=8, state=1}

答案 3 :(得分:1)

为了完成,我发布了另一种方式:自定义序列化器:

false

答案 4 :(得分:0)

另一种方式:

public enum State {

    @JsonProperty("0")
    ON,

    @JsonProperty("1")
    OFF,

    @JsonProperty("2")
    UNKNOWN
}

但是,这将产生{"state" : "1"}而不是{"state" : 1}(字符串,不是数字)。在大多数情况下都可以

答案 5 :(得分:0)

您可以通过这种方式使用

import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.NUMBER)
public enum State {
       ON,
       OFF,
       UNKNOWN
}