java jackson json处理器 - 在RestTemplate中使用 - 处理EnumSet

时间:2011-08-10 20:34:46

标签: java android json jackson

我有一个连接到JSON WebService的Android应用。其中一个方法为“flag-type”值返回逗号分隔的字符串列表,换句话说是位掩码。例如,它返回“FileAppend,FileOverwrite”。对于这种类型,我有一个java枚举定义

enum FileMode { FileAppend, FileOverwrite,   ... } 

并希望Jackson反序列化器自动将JSON有效负载中返回的String列表转换为枚举。我尝试了原始的Enum FileMode和EnumSet,但在反序列化时我在两种情况下都获得了异常。有没有办法以某种方式注释,以便反序列化器知道如何反序列化它?

@JsonIgnoreProperties(ignoreUnknown=true)
@JsonTypeName("AccessMask")
@JsonAutoDetect
public enum AccessMask {
None,

HideDateCreated,
HideDateModified,
HideDateTaken,
HideMetaData,
HideUserStats,
HideVisits,

NoCollections,
NoPrivateSearch,
NoPublicSearch,
NoRecentList,

ProtectExif,
ProtectXXLarge,             // new in version 1.3
ProtectExtraLarge,
ProtectLarge,
ProtectMedium,
ProtectOriginals,

ProtectGuestbook,           // new in version 1.1
NoPublicGuestbookPosts,     // new in version 1.1
NoPrivateGuestbookPosts,    // new in version 1.1
NoAnonymousGuestbookPosts,  // new in version 1.1

ProtectComments,            // new in version 1.1
NoPublicComments,           // new in version 1.1
NoPrivateComments,          // new in version 1.1
NoAnonymousComments,        // new in version 1.1

PasswordProtectOriginals,   // new in version 1.2

ProtectAll }

// and below is a property of a class defined below. 
class Picture {
  @JsonProperty("AccessMask")
  EnumSet<AccessMask> accessMask;
 }

AccessMask是一个位字段,意味着它可以有多个字段集(位掩码)。 当我使用JSON反序列化器反序列化此类时,我得到以下异常 嵌套异常是org.codehaus.jackson.map.JsonMappingException:无法从VALUE_STRING标记中反序列化java.util.EnumSet的实例

可能是什么原因?

此致

2 个答案:

答案 0 :(得分:1)

如果值是 - 如错误消息所示 - 只是一个JSON字符串,而不是预期的字符串数组,则需要编写自定义反序列化程序。但是为什么这些没有序列化为带有枚举值的JSON数组作为单独的字符串?杰克逊会在没有任何注释的情况下自动处理这个问题(你不需要添加任何注释,我认为它们是为了让事情有用而添加的。)

您可以直接在字段(@JsonDeserialize(using = MyDeserializer.class))注册反序列化程序,也可以注册该类型的反序列化程序。

答案 1 :(得分:0)

在json中,将值作为字符串数组传递。例如 - 如果您有DAY的枚举,其中DAY是值为MONDAY,TUESDAY等的枚举,则将值传递为 - &#34;天&#34; :&#34;星期一&#34;&#34;星期日&#34;]

默认反序列化导致创建枚举。