Jackson:将枚举值序列化并反序列化为整数

2022-09-01 00:45:44

请考虑以下枚举和类:

public enum State {
    OFF,
    ON,
    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, State.OFF);
    ObjectMapper mapper = new ObjectMapper();
    String machineAsJsonString = mapper.writeValueAsString(m);
    System.out.println(machineAsJsonString);
}

目前,该主线的输出为:

{"name" : "Machine 1", "numCores" : 8, "state" : "OFF"}

这个输出对我来说不好,因为我希望它不是 的字符串,这是枚举中的序数值。"OFF"state0OFFState

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

{"name" : "Machine 1", "numCores" : 8, "state" : 0}

有没有一些优雅的方法来让它以这种方式表现?


答案 1

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

public enum State {
    OFF,
    ON,
    UNKNOWN;

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

这也适用于反序列化,如Javadoc of annotation中所述:@JsonValue

注意:当用于 Java 枚举时,一个额外的功能是,由带注释的方法返回的值也被视为要反序列化的值,而不仅仅是要序列化的 JSON 字符串。这是可能的,因为枚举值的集合是恒定的,并且可以定义映射,但对于POJO类型通常不能完成;因此,这不用于POJO反序列化


答案 2

您可以使用设置

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/ 小费