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

新手上路,请多包涵

考虑以下枚举和类:

 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"}

此输出对我 state ,因为我希望它是 0 的 --- 的字符串 "OFF" 而不是 OFF 在枚举中 State

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

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

有没有一些优雅的方法让它表现得像这样?

原文由 SomethingSomething 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 790
2 个回答

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

 public enum State {
    OFF,
    ON,
    UNKNOWN;

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

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

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

原文由 user861594 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题