考虑以下枚举和类:
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
是否有一些优雅的方式让它以这种方式运作?
答案 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://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
}