2014-12-19 161 views
0

我需要使用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。但是如何?

+0

爲什麼不嘗試使用'TypeToken'並讓傑克遜完成工作? – fge 2014-12-19 02:40:32

+0

怎麼樣?我讀了一些例子,如:http://www.baeldung.com/gson-deserialization-guide,做反序列化,字符串必須是json格式,即字符串json =「{\」theValue \「:1 }「;這樣你可以新的Gson()。fromJson(json,typeToken);這裏我的字符串只是一個簡單的字符串「key1」。在這種情況下如何使用typeToken()?你能告訴我一個例子嗎?感謝您的回答。 – user389955 2014-12-19 02:54:48

+0

對不起,在傑克遜這將是一個'TypeReference',但原理是一樣的;無論如何,你似乎在循環中讀取一個'CacheValue',但你想要一個'Map >'; 'CacheValue'擴展/實現'ValueClass'嗎? – fge 2014-12-19 02:58:28

回答

0

通常情況下,你可以使用,一個ObjectMapper並把它傳遞一個TypeReference作爲參數:

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

return mapper.readValue(theFileObject, typeRef); 

這應該工作開箱。如果不是,則會拋出一個豁免並指出問題所在。

+0

你不能,如果顯示「錯誤的數字類型參數;需要1」,因爲TypeReference只允許一個參數。 – user389955 2014-12-19 03:35:26

+0

這是我的一個語法錯誤;見編輯 – fge 2014-12-19 03:50:13

+0

其實我想用流媒體。您的解決方案將一起讀取整個事情。注意我有大量的行要讀取(即n非常大),所以不需要調用readValue(...)來讀取所有行,我想讀取n次。每次閱讀一個條目。這就是爲什麼我分別解析密鑰及其價值。 – user389955 2014-12-19 03:56:45

相關問題