2011-08-10 29 views
0

處理我有一個Android應用連接到一個JSON的WebService。其中一種方法返回「flag-type」值的逗號分隔字符串列表,換句話說就是一個位掩碼。例如,它返回「FileAppend,FileOverwrite」。對於這種類型我有一個Java枚舉定義java的傑克遜JSON處理器 - 使用RestTemplate - EnumSet

enum FileMode { FileAppend, FileOverwrite, ... } 

,並希望傑克遜解串器以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; 
} 

AccessMask是一個位字段,意思是它可以有多個字段集(位掩碼)。 當我使用JSON序列化解串器這個班,我得到了以下異常 嵌套的例外是org.codehaus.jackson.map.JsonMappingException:無法反序列化java.util.EnumSet中的實例進行VALUE_STRING令牌

什麼可能原因?

問候

+0

什麼異常?基本的JSON字符串列表像'[「enum1」,「enum3」]'將工作得很好,假設值與枚舉值匹配。 – StaxMan

+0

我提供了有關正在反序列化的異常和類型的詳細信息。 – cubesoft

回答

1

如果值是 - 作爲錯誤信息顯示 - 只是一個JSON字符串,而不是將預期,字符串數組,你需要編寫一個自定義解串器。但是,爲什麼這些不被序列化爲具有枚舉值作爲單獨字符串的JSON數組?傑克遜會自動處理這些信息,而不需要任何註釋(不需要添加任何註釋,我認爲他們是爲了使事情有效而添加的)。

可以解串器直接裝場寄存器(@JsonDeserialize(使用= MyDeserializer.class))或通過針對該類型註冊解串器。

+0

在JSON有效載荷,它看起來如下:「AccessMask」:「ProtectOriginals,ProtectXXLarge」 – cubesoft

+0

我不知道這是如何不被反序列化 – cubesoft

+0

這僅僅是一個字符串 - 有從字符串到EnumSet不自然的映射;該邏輯表示形式將作爲JSON數組而不是String。所以你需要添加自定義的反序列化器來處理這種自定義的情況。 – StaxMan

0

在JSON,將值作爲字符串的數組。例如 - 如果你有enumset DAY,其中DAY是值的枚舉星期一,星期二,等於是將值作爲的 - 「天」:「MONDAY」,「SUNDAY」]

默認反序列化的結果產生enumset。