考虑以下枚举和类:
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}
有一些优雅的方法可以使其表现为这种方式吗?
它应该通过指定JsonValue
映射器来工作。
public enum State {
ON,
OFF,
UNKNOWN;
@JsonValue
public int toValue() {
return ordinal();
}
}
如@JsonValue
注解的Javadoc所述,这也适用于反序列化:
注意:当用于Java枚举时,一个附加功能是带注释的方法返回的值也被视为要反序列化的值,而不仅仅是序列化为JSON字符串的值。这是可能的,因为Enum值的集合是恒定的,并且可以定义映射,但是通常不能对POJO类型执行此操作。因此,这不用于POJO反序列化
问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因
我使用的是JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@jsonValue,这似乎完成了它将对象序列化为:
我正在尝试从整数值反序列化scala枚举。 当我尝试反序列化这个字段时,它会抛出一个错误-的值com.example.TestEnum$JsonToken.VALUE_NUMBER_INT 我看到jackson doc建议在java中使用JsonCreator,但是没有提到scala enum。 我使用默认的ScalaMapper没有任何定制在这里。
问题内容: 我正在尝试并且未能对Jackson 2.5.4的枚举进行反序列化,并且我不太清楚我的情况。我的输入字符串是驼峰式的,我想简单地映射到标准的Enum约定。 我也尝试了吸气剂,但没有成功,这是我在其他地方看到的一种选择。他们都炸毁了: 我究竟做错了什么? 问题答案: 编辑: 从Jackson 2.6开始,您可以在枚举的每个元素上使用以指定其序列化/反序列化值(请参见此处): (此答案的其余
我正在尝试使用jackson-DataBind Objectmapper反序列化一个JSON字符串,其中包含一组枚举属性。当JSON中出现未在枚举中定义的未知属性时,就会发生这种情况。请在下面找到我正在使用的对象映射器配置。 但是,反序列化(ObjectMapper.ReadValue(jsonText,.class);)抛出此错误。“test”是要反序列化的JSON字符串中的未知属性。 Com.
问题内容: 我如何使用gson 2.2.4序列化和反序列化一个简单的枚举? 问题答案: 根据 GsonAPI文档 ,Gson提供了的默认序列化/反序列化,因此基本上,应使用标准和方法(与其他类型一样)对序列化和反序列化。