java jackson json处理器-在RestTemplate中使用-枚举集的处理

java jackson json处理器-在RestTemplate中使用-枚举集的处理,java,android,json,jackson,Java,Android,Json,Jackson,我有一个Android应用程序,可以连接到JSON Web服务。其中一个方法返回“标志类型”值的逗号分隔字符串列表,也就是位掩码。例如,它返回“FileAppend,FileOverwrite”。对于这种类型,我定义了一个java枚举 enum FileMode { FileAppend, FileOverwrite, ... } 并希望Jackson反序列化程序自动将JSON负载中返回的字符串列表转换为枚举。我尝试了原始Enum FileMode和EnumSet,但在反序列化时,这两种

我有一个Android应用程序,可以连接到JSON Web服务。其中一个方法返回“标志类型”值的逗号分隔字符串列表,也就是位掩码。例如,它返回“FileAppend,FileOverwrite”。对于这种类型,我定义了一个java枚举

enum FileMode { FileAppend, FileOverwrite,   ... } 
并希望Jackson反序列化程序自动将JSON负载中返回的字符串列表转换为枚举。我尝试了原始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;
 }
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonTypeName(“访问掩码”)
@JsonAutoDetect
公共枚举访问掩码{
没有一个
希德代特创造,
隐藏的修改,
希德达特肯,
藏匿,
希德乌斯塔斯,
隐匿,
无集合,
没有私人研究,
没有公共研究,
最新名单,
ProtectExif,
ProtectXXLarge,//版本1.3中新增
超大型,
大,,
保护剂,
保护原件,
ProtectGuestbook,//版本1.1中新增
NoPublicGuestbookPosts,//在1.1版中新增
NoPrivateGuestbookPosts,//版本1.1中新增
NoAnonymousGuestbookPosts,//版本1.1中新增
ProtectComments,//版本1.1中新增
NoPublicComments,//在版本1.1中新增
NoPrivateComments,//版本1.1中新增
NoAnonymousComments,//版本1.1中新增
PasswordProtectOriginals,//版本1.2中新增
ProtectAll}
//下面是下面定义的类的属性。
班级照片{
@JsonProperty(“访问掩码”)
枚举集访问掩码;
}
AccessMask是一个位字段,意味着它可以有多个字段集(位掩码)。 当我使用JSON反序列化器反序列化这个类时,我得到了以下异常 嵌套的异常为org.codehaus.jackson.map.JsonMappingException:无法反序列化java.util.EnumSet的实例,因为它没有值\u字符串标记

原因可能是什么

考虑到

如果值(如错误消息所示)只是一个JSON字符串,而不是预期的字符串数组,则需要编写一个自定义反序列化程序。但为什么不将它们序列化为JSON数组,并将枚举值作为单个字符串?Jackson会在没有任何注释的情况下自动处理这个问题(您添加的注释都不需要,我想它们是为了让事情顺利进行而添加的吧?)


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

在json中,将值作为字符串数组传递。例如,如果您有一个日期的枚举集,其中日期是一个枚举,其值为星期一、星期二等,然后将值作为- “天”:[“星期一”、“星期日”]


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

什么样的异常?假设值与枚举值匹配,像“[“enum1”、“enum3”]”这样的基本JSON字符串列表可以正常工作。我提供了有关异常和反序列化类型的详细信息。在JSON负载中,它如下所示:“AccessMask”:“ProtectOriginals,ProtectXXLarge”我不知道这怎么会不会得到反序列化DIT只是一个字符串——从字符串到枚举集没有自然的映射;逻辑表示将是JSON数组,而不是字符串。因此,您需要添加自定义反序列化程序来处理此类自定义情况。