2016-07-15 5 views
2

JSON을 Map<Integer, String>으로 역 직렬화합니다.JSON 객체 키를 Jackson과 어떻게 정수로 파싱합니까?

key을 프리미티브 int에 할당하려고하면 위의 classCastException이 발생합니다.

ObjectReader reader = new ObjectMapper().reader(Map.class); 
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}"; 
Map<Integer, String> map = reader.readValue(patternMetadata); 
System.out.println("map: " + map); 
for (Map.Entry<Integer, String> entry : map.entrySet()) 
{ 
    try 
    { 
     System.out.println("map: " + entry.getKey()); 
     int index = entry.getKey(); 
     System.out.println("map**: " + index); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

나는 try 블록에서 두 번째 행에서이 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer 예외를 얻고있다.

심지어 변경하려고 시도했습니다 int index = enty.getKey().intValue(). 그러나 여전히 같은 예외가 발생합니다.

P .: Robolectric 프레임 워크를 사용하여 Android 스튜디오에서 실행하고 있습니다.

+3

JSON 속성은 * 결코 *'int' 값입니다; 그들은 항상 * 문자열입니다. 나는 당신이 문자열을 구문 분석해야한다고 생각합니다 ... –

답변

4

이러한 키는 정수가 아니며 문자열입니다. 그들에 따옴표를 참고 :

String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}"; 
// ------------------------^^-^^-----------^^-^^------------^^-^^ 

을이 JSON은 (는 것 같다), 객체 속성 이름은 항상 문자열이있는 경우.

너는 Map<String, String>이 필요하고, 필요하다면 int에 열쇠를 명시 적으로 파싱해야 할 것이다.

+0

그렇다면 어떻게 성공적으로 Map 으로 비 직렬화됩니까? – Heisenberg

+1

@Heisenberg : 그렇지 않습니다. 그것은 deserialize되어 Map으로 변환됩니다. 유형 삭제를 기억하십시오. :-)'ObjectMapper'는 그냥 원시'Map'을 사용하고 있습니다. 'try' 블록의 두 번째 줄은 컴파일러가 유형별 캐스트를 삽입 한 코드의 첫 번째 부분입니다. 따라서이 부분에서 실패합니다. –

2

Jackson은 키를 기본 유형 (또는 몇 가지 추가 구성이있는 사용자 정의 유형)으로 비대화 할 수 있습니다.

Map은 제네릭 유형이므로 원하는 매개 변수화를 설명하려면 TypeReference을 사용해야합니다.

reader은 2.5 이후로 사용되지 않습니다. 대신 readerFor을 사용해야합니다. 적절한 TypeReference을 제공하고 MapInteger 키를 제공하여 ObjectReader을 구성하십시오. 그러면 잭슨은 Integer 값을지도의 키로 예상한다는 것을 알게됩니다.

ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Map<Integer, String>>() { 
}); 

전체 예를

ObjectReader reader = new ObjectMapper().readerFor(new TypeReference<Map<Integer, String>>() { 
}); 
String patternMetadata = "{\"1\":\"name\", \"2\":\"phone\", \"3\":\"query\"}"; 
Map<Integer, String> map = reader.readValue(patternMetadata); 
System.out.println("map: " + map); 
for (Map.Entry<Integer, String> entry : map.entrySet()) { 
    try { 
     System.out.println("map: " + entry.getKey()); 
     int index = entry.getKey(); 
     System.out.println("map**: " + index); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

인쇄

map: {1=name, 2=phone, 3=query} 
map: 1 
map**: 1 
map: 2 
map**: 2 
map: 3 
map**: 3