我需要使用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