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로 변환 할 수 있어야합니다. 하지만 어떻게?
왜 'TypeToken'을 사용해 보시고 Jackson이 그 일을 해보지 않으시겠습니까? – fge
어떻게? 나는 다음과 같은 몇 가지 예제를 읽는다 : http://www.baeldung.com/gson-deserialization-guide, de-serialize를하기 위해 문자열은 json 형식이어야한다. 즉 String json = "{\"theValue \ ": 1 } "; 그런 식으로 당신은 새로운 Gson()을 할 수 있습니다 .Json (json, typeToken); 여기 내 문자열은 단순한 문자열 "key1"입니다. 이 경우 typeToken()을 사용하는 방법은 무엇입니까? 예를 보여줄 수 있습니까? 귀하의 답변에 감사드립니다. – user389955
미안 해요, 잭슨에서'TypeReference'가 될 것이지만 원칙은 동일합니다. 어쨌든, 당신은 루프에서'CacheValue'를 읽는 것 같지만'Map>'; 'CacheValue'는'ValueClass'를 확장/구현합니까? –
fge