2014-12-17 2 views
1

내가 통해 Map<String, String>에 JSON 문자열로 변환 구현 알고있다 : I 변환을 확장 할 수 없습니다 그러나잭슨 JSON

public <T1, T2> HashMap<T1, T2> getMapFromJson(String json, Class<T1> keyClazz, Class<T2> valueClazz) throws TMMIDConversionException { 
    if (StringUtils.isEmpty(json)) { 
     return null; 
    } 
    try { 
     ObjectMapper mapper = getObjectMapper(); 
     HashMap<T1, T2> map = mapper.readValue(json, TypeFactory.defaultInstance().constructMapType(HashMap.class, keyClazz, valueClazz)); 
     return map; 
    } catch (Exception e) { 
     Logger.error(e.getMessage(), e.getCause()); 
    } 
} 

내 JSON은 Map<String, Set<String>>입니다. 위의 방법은 설정 항목을 손상시키고 목록에 넣기 때문에 분명히 실패합니다. 여기에 도움이 필요해 !! 감사합니다.

샘플 JSON 문자열은 다음과 같습니다. 이 JSOn은 Map<String, Set<CustomClass>>으로 변환되어야합니다.

{ 
    "0": [ 
     { 
      "cid": 100, 
      "itemId": 0, 
      "position": 0 
     } 
    ], 
    "1": [ 
     { 
      "cid": 100, 
      "itemId": 1, 
      "position": 0 
     } 
    ], 
    "7": [ 
     { 
      "cid": 100, 
      "itemId": 7, 
      "position": -1 
     }, 
     { 
      "cid": 140625, 
      "itemId": 7, 
      "position": 1 
     } 
    ], 
    "8": [ 
     { 
      "cid": 100, 
      "itemId": 8, 
      "position": 0 
     } 
    ], 
    "9": [ 
     { 
      "cid": 100, 
      "itemId": 9, 
      "position": 0 
     } 
    ] 
} 
+0

JSON이 도움이 될 것입니다 ... –

+0

샘플 JSON을 추가했습니다. 감사. –

+0

그리고 어떻게 그것이 'Multimap'에 매핑됩니까? –

답변

4

이 시도 :

JavaType setType = mapper.getTypeFactory().constructCollectionType(Set.class, CustomClass.class); 
JavaType stringType = mapper.getTypeFactory().constructType(String.class); 
JavaType mapType = mapper.getTypeFactory().constructMapType(Map.class, stringType, setType); 

String outputJson = mapper.readValue(json, mapType) 
1

불행하게도 Class 정말 일반적인 유형을 표현할 수 없습니다; 따라서 값 유형이 일반적인 경우 (예 : Set<String>) JavaType을 전달해야합니다. 그리고 이것도 구조화 된 JavaType 인스턴스를 생성하는 데 사용될 수 있습니다.