我需要使用Jackson streaming API對以下文件進行反序列化。如何將字符串轉換爲泛型類型對象
{ 「key1」: {「value」:{…} },
「key2」: {「value」:{…} },
「key3」: {「value」:{…}},
....
「keyn」: {「value」:{…}}
}
然後把它們使用HashMap的kvmap kvmap.put(K,ValueClass)一個; 我的理解是,要做到這一點的方法是:我必須使用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'並讓傑克遜完成工作? – fge 2014-12-19 02:40:32
怎麼樣?我讀了一些例子,如:http://www.baeldung.com/gson-deserialization-guide,做反序列化,字符串必須是json格式,即字符串json =「{\」theValue \「:1 }「;這樣你可以新的Gson()。fromJson(json,typeToken);這裏我的字符串只是一個簡單的字符串「key1」。在這種情況下如何使用typeToken()?你能告訴我一個例子嗎?感謝您的回答。 – user389955 2014-12-19 02:54:48
對不起,在傑克遜這將是一個'TypeReference',但原理是一樣的;無論如何,你似乎在循環中讀取一個'CacheValue',但你想要一個'Map>'; 'CacheValue'擴展/實現'ValueClass'嗎? –
fge
2014-12-19 02:58:28