2014-12-19 172 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

相关问题