如何使用Jackson json注释enum字段以进行反序列化

Jackson 1.6.2 REST Web服务/ Apache Wink

如何对枚举字段进行注释以便jackson对其进行反序列化?

内心阶级

public enum BooleanField { BOOLEAN_TRUE { public String value() { return "1";} }, BOOLEAN_FALSE { public String value() { return "0";} }, 

Java Bean / Request对象

 BooleanField locked; public BooleanField getLocked() {return locked;} 

Jackson文档声明它可以通过@JsonValue / @JsonCreator完成此@JsonCreator但不提供任何示例(如何有用!)。 我敢肯定他们只是不想让太多人使用他们的框架,所以他们保守秘密。

有谁愿意溢出(java)bean,因为它是?

如果您使用的是Jackson 1.9,序列化将通过以下方式完成:

 public enum BooleanField { BOOLEAN_TRUE("1") ; // either add @JsonValue here (if you don't need getter) private final String value; private BooleanField(String value) { this.value = value; } // or here @JsonValue public String value() { return value; } 

所以改变你需要的是向Enum类型本身添加方法,所以所有值都有它。 不确定它是否适用于子类型。

对于@JsonCreator ,有一个静态工厂方法可以做到; 所以添加如下内容:

 @JsonCreator public static BooleanField forValue(String v) { ... } 

Jackson 2.0实际上支持仅使用@JsonValue ,包括反序列化。

随着jackson2.7.2或更新

 public enum BooleanField { @JsonProperty("1") BOOLEAN_TRUE, @JsonProperty("0") BOOLEAN_FALSE } 

不要注释它们,只需配置您的ObjectMapper实例:

 private ObjectMapper createObjectMapper() { final ObjectMapper mapper = new ObjectMapper(); // enable toString method of enums to return the value to be mapped mapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); mapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); return mapper; } 

并在您的枚举中重写toString()方法:

 public enum SectionType { START("start"), MORE("more"); // the value which is used for matching // the json node value with this enum private final String value; SectionType(final String type) { value = type; } @Override public String toString() { return value; } } 

您不需要任何注释或自定义反序列化器。

实际上,根据JsonValue(Jackson 2.3.3)的文档:

 NOTE: when use for Java enums, one additional feature is * that value returned by annotated method is also considered to be the * value to deserialize from, not just JSON String to serialize as. * This is possible since set of Enum values is constant and it is possible * to define mapping, but can not be done in general for POJO types; as such, * this is not used for POJO deserialization. 

因此对于枚举,您的反序列化将无法使用JsonCreator,因为JsonValue将用于序列化和反序列化。 对枚举执行此操作的一种方法是使用JsonSetter和JsonGetter。

如果枚举是数组,则以下内容可能有效。 (仅用于反序列化)

 package com.stack.model; import java.util.HashMap; import java.util.Map; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import lombok.Data; @Data @JsonInclude(JsonInclude.Include.NON_NULL) @JsonIgnoreProperties(ignoreUnknown = true) @JsonPropertyOrder({ "success", "my-enums" }) public class MyObjectJSON { @JsonProperty("sucess") private boolean success; @JsonProperty("my-enums") private MyEnum[] myEnums; static enum MyEnum { Enum1, Enum2, Enum3, Enum4, EnumN; private static Map myEnumsMap = new HashMap(5); static { myEnumsMap.put("enum1-val", Enum1); myEnumsMap.put("enum2-val", Enum2); myEnumsMap.put("enum3-val", Enum3); myEnumsMap.put("enum4-val", Enum4); myEnumsMap.put("enumn-val", EnumN); } @JsonCreator public static MyEnum forValue(String value) { return myEnumsMap.get(value.toLowerCase()); } } } 

要考虑:

  1. @Data注释生成setter,getters,toString等。
  2. @JsonProperty(“my-enums”)私有MyEnum [] myEnums,这是用jackson注释Enum类型字段的方法(如果它是一个数组,它是否有效)。

  3. MyEnum是要映射的JSON对象的值的枚举,假设以下对象:

    {“sucess”:true,“my-enums”:[“enum1-val”,“enum3-val”]}

  4. forValue函数允许将数组的字符串值映射到Enum,它使用@JsonCreator注释以指示反序列化中使用的构造工厂。