如何使用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()); } } }
要考虑:
- @Data注释生成setter,getters,toString等。
-
@JsonProperty(“my-enums”)私有MyEnum [] myEnums,这是用jackson注释Enum类型字段的方法(如果它是一个数组,它是否有效)。
-
MyEnum是要映射的JSON对象的值的枚举,假设以下对象:
{“sucess”:true,“my-enums”:[“enum1-val”,“enum3-val”]}
-
forValue函数允许将数组的字符串值映射到Enum,它使用@JsonCreator注释以指示反序列化中使用的构造工厂。
- Spring 3使用Jackson将ArrayList序列化为JSON而不包装到对象(没有名称)
- 如何在Jackson中为generics类型创建自定义反序列化器?
- Hibernate用户和朋友JsonReference
- Jackson2 PropertyFilter用于嵌套属性,还是有另一种方法?
- Spring REST,JSON“无法处理托管/后向引用’defaultReference’”415不支持的媒体类型
- Lazy One-To-One Spring JPA并构建“动态”JSON
- 使用Jackson将对象转储为String
- 使用Jackson XML映射器将Java List序列化为XML
- RestEASY和Jackson不兼容 – NoSuchMethodException