一尘不染

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

json

考虑以下枚举和类:

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

当前,该主输出为:

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

这种输出并不适合我,因为除了字符串"OFF"state,我想它是1,这是序号值OFF在枚举State

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

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

有一些优雅的方法可以使其表现为这种方式吗?


阅读 892

收藏
2020-07-27

共1个答案

一尘不染

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

public enum State {
    ON,
    OFF,
    UNKNOWN;

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

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

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

2020-07-27