考虑以下枚举和类:
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。
"OFF"
state
1
OFF
State
所以我想要得到的实际结果是:
{"name" : "Machine 1", "numCores" : 8, "state" : 1}
有一些优雅的方法可以使其表现为这种方式吗?
它应该通过指定JsonValue映射器来工作。
JsonValue
public enum State { ON, OFF, UNKNOWN; @JsonValue public int toValue() { return ordinal(); } }
如@JsonValue注解的Javadoc所述,这也适用于反序列化:
@JsonValue
注意:当用于Java枚举时,一个附加功能是带注释的方法返回的值也被视为要反序列化的值,而不仅仅是序列化为JSON字符串的值。这是可能的,因为Enum值的集合是恒定的,并且可以定义映射,但是通常不能对POJO类型执行此操作。因此,这不用于POJO反序列化