我有一个连接到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的实例
可能是什么原因?
此致
答案 0 :(得分:1)
如果值是 - 如错误消息所示 - 只是一个JSON字符串,而不是预期的字符串数组,则需要编写自定义反序列化程序。但是为什么这些没有序列化为带有枚举值的JSON数组作为单独的字符串?杰克逊会在没有任何注释的情况下自动处理这个问题(你不需要添加任何注释,我认为它们是为了让事情有用而添加的。)
您可以直接在字段(@JsonDeserialize(using = MyDeserializer.class))注册反序列化程序,也可以注册该类型的反序列化程序。
答案 1 :(得分:0)
在json中,将值作为字符串数组传递。例如 - 如果您有DAY的枚举,其中DAY是值为MONDAY,TUESDAY等的枚举,则将值传递为 - &#34;天&#34; :&#34;星期一&#34;&#34;星期日&#34;]
默认反序列化导致创建枚举。