2014-12-19 2 views
0

Jackson Streaming API를 사용하여 다음 파일의 직렬화를 해제해야합니다.문자열을 제네릭 형식 개체로 변환하는 방법

{ “key1”: {“value”:{…} }, 
    “key2”: {“value”:{…} }, 
    “key3”: {“value”:{…}}, 
    .... 
    “keyn”: {“value”:{…}} 
} 

그런 다음 kvmap.put (K, ValueClass);을 사용하여 HashMap kvmap에 저장하십시오. 저의 이해는 다음과 같습니다. jp.getCurrentName()을 사용하여 K의 문자열을 구문 분석 한 다음 mapper.readValue (jp, ValueClass.class)를 사용하여 ValueClass를 얻어야합니다. 즉 :

private <K, V> HashMap<K, ValueClass<V>> loadFileStream(File f) 
     ObjectMapper mapper = new ObjectMapper(); 
     HashMap<K, ValueClass<V>> kvmap = ... 
     .... 
     current = jp.nextToken(); 
     if (current != JsonToken.START_OBJECT) { 
      return with error information. 
     } 
     while (jp.nextToken() != JsonToken.END_OBJECT) { 
     String key = jp.getCurrentName(); 
     K = implement a function to convert from key to K; 
     current = jp.nextToken(); 
     if (current == JsonToken.START_OBJECT) { 
       ValueClass<V> value = mapper.readValue(jp, ValueClass.class); 
       kvmap.put(K, value); 
     } 
     else {jp.skipChildren();} 
     } 
     return kvmap; 
} 

나의 이해는, 키를 역 직렬화 할 수있는 유일한 방법은 jp.getCurrentName()가 포함되어 있지 않기 때문에 {}는 JSON 형식으로 내가 readValue 같은 사용하여 얻을 수 없다() 것입니다. 맞습니까? 그럼 제 질문은 문자열 키를 제네릭 타입 K로 변환하는 함수를 구현하는 방법입니까? 만약 readValue()가 문자열을 해당 제네릭 형식으로 변환 할 수 있다면 이상적으로 문자열 키를 제네릭 형식 K로 변환 할 수 있어야합니다. 하지만 어떻게?

+0

왜 'TypeToken'을 사용해 보시고 Jackson이 그 일을 해보지 않으시겠습니까? – fge

+0

어떻게? 나는 다음과 같은 몇 가지 예제를 읽는다 : http://www.baeldung.com/gson-deserialization-guide, de-serialize를하기 위해 문자열은 json 형식이어야한다. 즉 String json = "{\"theValue \ ": 1 } "; 그런 식으로 당신은 새로운 Gson()을 할 수 있습니다 .Json (json, typeToken); 여기 내 문자열은 단순한 문자열 "key1"입니다. 이 경우 typeToken()을 사용하는 방법은 무엇입니까? 예를 보여줄 수 있습니까? 귀하의 답변에 감사드립니다. – user389955

+0

미안 해요, 잭슨에서'TypeReference'가 될 것이지만 원칙은 동일합니다. 어쨌든, 당신은 루프에서'CacheValue'를 읽는 것 같지만'Map >'; 'CacheValue'는'ValueClass'를 확장/구현합니까? – fge

답변

0

일반적으로, 당신은 단지에 대한 ObjectMapper를 사용하고 인수로 그것을 TypeReference를 전달할 수 있습니다 :이 상자 밖으로 작동합니다

final TypeReference typeRef = new TypeReference<Map<K, ValueClass<V>>>(){}; 

return mapper.readValue(theFileObject, typeRef); 

. 그렇지 않은 경우 면제가 발생하고 문제가있는 곳을 표시합니다.

+0

을 입력 할 수 없습니다. – user389955

+0

그건 내 부분에 구문 오류가; 편집 – fge

+0

을 참조하십시오 사실 스트리밍을 사용하고 싶었습니다. 당신의 솔루션은 모든 것을 함께 읽습니다. readline (...)을 한 번 읽으려는 대신, n 회 읽으려고합니다. 매번 한 항목을 읽습니다. 왜 내가 열쇠와 그 가치의 파싱을 분리하는지. – user389955

관련 문제