2011-08-10 14 views
0

私はJSON WebServiceに接続するAndroidアプリを持っています。メソッドの1つは、 "flag-type"値のコンマ区切り文字列リスト、つまりビットマスクを返します。たとえば、 "FileAppend、FileOverwrite"を返します。このタイプのために私はJavaの列挙型を持っているjava jackson json processor - 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; 
} 

アクセスマスクは、複数のフィールドセット(ビットマスク)を持つことができるビットフィールドです。私は、JSONのデシリアライザを使用して、このクラスをデシリアライズするとき は、私が 、ネストされた例外はorg.codehaus.jackson.map.JsonMappingExceptionで、次の例外が発生しました:VALUE_STRINGのうち、java.util.EnumSetのインスタンスをデシリアライズすることはできませんトークン

であるかもしれないもの理由?

よろしく

+0

どのような例外がありますか? '["enum1"、 "enum3"]'のような基本的なJSON Stringリストは、値がenum値と一致すると仮定してうまくいくでしょう。 – StaxMan

+0

デシリアライズされている例外と型に関する詳細情報を提供しました。 – cubesoft

答えて

1

値がある場合 - エラーメッセージが示すように - ちょうどJSON文字列ではなく、期待と同じように、文字列の配列は、カスタムデシリアライザを記述する必要があります。しかし、なぜこれらは列挙型の値を持つJSON配列としてシリアル化されていないのですか? Jacksonはこれを自動的に処理します(追加したアノテーションは必要ありません。

デシリアライザは、フィールド(@JsonDeserialize(using = MyDeserializer.class))に直接登録することも、そのタイプのデシリアライザを登録することによって登録することもできます。

+0

jsonペイロードでは、次のようになります。 "AccessMask": "ProtectOriginals、ProtectXXLarge" – cubesoft

+0

これはデシリアライズされない方法がわかりません – cubesoft

+0

これは単なる文字列です - StringからEnumSetへの自然なマッピングはありません。論理表現はJSON配列であり、Stringではありません。カスタムケースを処理するカスタムデシリアライザを追加する必要があります。 – StaxMan

0

jsonでは、値を文字列の配列として渡します。たとえば、DAYのenumsetがある場合、DAYはMONDAY、TUESDAYなどの値を持つ列挙型です。- 「日」:["MONDAY"、 "SUNDAY"]

デシリアライズのデフォルトの結果は、 enumset。

関連する問題