2011-08-10 7 views
0

JSON WebService에 연결하는 Android 앱이 있습니다. 메서드 중 하나는 "flag-type"값에 대한 쉼표로 구분 된 문자열 목록, 즉 비트 마스크를 반환합니다. 예를 들어, "FileAppend, FileOverwrite"를 반환합니다. 이러한 유형의 나는 자바 열거가 java jackson json 프로세서 - RestTemplate에서 사용 - EnumSet 처리

enum FileMode { FileAppend, FileOverwrite, ... } 

정의가 잭슨 디시리얼라이저가 자동으로 열거으로 JSON 페이로드에 반환 된 문자열 목록을 변환 할. 원시 열거 형 FileMode 및 EnumSet 시도했지만 두 경우 모두 deserialization 동안 예외가 발생합니다. deserializer가 deserialize하는 방법을 알 수 있도록 어떻게 든 주석을 달 수있는 방법이 있습니까?

@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

어떤 종류의 예외입니까? '[ ""enum1 ","enum3 "]'과 같은 기본 JSON 문자열 목록은 값이 enum 값과 일치한다고 가정하고 정상적으로 작동합니다. – StaxMan

+0

deserialized되는 예외 및 형식에 대한 자세한 정보를 제공했습니다. – cubesoft

답변

1

값이있는 경우 - 오류 메시지에서 알 수 있듯이 - 단지 JSON 문자열, 그리고 기대하는 것처럼, 문자열의 배열, 사용자 정의 디시리얼라이저를 작성해야합니다. 하지만 이들이 개별 문자열로 enum 값을 가진 JSON 배열로 직렬화되지 않는 이유는 무엇입니까? Jackson은 주석없이 자동으로 처리합니다 (추가 한 주석 중 어느 것도 필요하지 않습니다.

디시리얼라이저를 필드 (@JsonDeserialize (using = MyDeserializer.class))에 직접 등록하거나 해당 유형의 디시리얼라이저를 등록 할 수 있습니다.

+0

json 페이로드에서 다음과 같이 보입니다 : "AccessMask": "ProtectOriginals, ProtectXXLarge" – cubesoft

+0

이것이 어떻게 역 직렬화되지 않는지 알 수 없습니다. – cubesoft

+0

그냥 문자열입니다. String에서 EnumSet으로의 자연스러운 매핑은 없습니다. 논리 표현은 String이 아닌 JSON 배열이됩니다. 따라서 사용자 정의 디시리얼라이저를 추가하여 이러한 사용자 정의 케이스를 처리해야합니다. – StaxMan

0

json에서는 값을 문자열 배열로 전달하십시오. 예를 들어 - 당신이 날은 월요일, 화요일, 등은 다음과 같이 값을 전달 값을 열거입니다 DAY,의 각각 EnumSet 경우 - "일": [ "월요일", "일요일"] 만드는

기본 직렬화 결과 enumset.

관련 문제