我试图将以下三种方法变成一个通用解决方案,我尝试了一些可以编译但在运行时表现不佳的想法。
public static List<User> parseToUsers(HttpResponse response) {
ObjectMapper mapper = new ObjectMapper();
String results = parseToString(response);
return mapper.readValue(results, new TypeReference<List<User>>() {});
}
public static List<Record> parseToRecords(HttpResponse response) {
ObjectMapper mapper = new ObjectMapper();
String results = parseToString(response);
return mapper.readValue(results, new TypeReference<List<Record>>() {});
}
public static Record parseToRecord(HttpResponse response) {
ObjectMapper mapper = new ObjectMapper();
String results = parseToString(response);
return mapper.readValue(results, new TypeReference<Record>() {});;
}
我也试图理解这一点关于超级类型令牌的博客文章 http://gafter.blogspot.com/2006/12/super-type-tokens.html.
EDIT:
这是我到目前为止想到的:
public static <T> T parseJsonResponse(TypeReference<T> type, HttpResponse response) throws DroidException {
ObjectMapper mapper = new ObjectMapper();
String results = parseResponseToString(response);
return readValue = mapper.readValue(results, type);
}
然后我就这样称呼它。
parseJsonResponseToList(new TypeReference<List<Record>>() {}, response)
不太满意,有更好的解决办法吗?
那么问题到底出在哪里呢?你从哪方面不喜欢它?
Jackson 还有其他构建泛型类型的方法;所以也许我们正在寻找的是:
public List<T> listOf(String json, Class<T> elementType) {
ObjectMapper mapper = new ObjectMapper(); // should (re)use static instance for perf!
JavaType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, elementType);
return mapper.readValue(json, listType);
}
TypeFactory
可以用于以编程方式构造使用泛型的类型——返回类型是JavaType
,因为基本的JavaClass
被类型擦除。TypeFactory
实际上是用来转换的TypeReference
to JavaType
内部也是如此。
EDIT
对于常规的非 Collection/Map 类型,它确实非常简单:
public T parseSingle(Class<T> cls, InputStream src) throws IOException {
return mapper.readValue(src, cls);
}
(您也不想将内容读取为字符串——不仅速度慢,而且很容易搞乱字符编码,所以如果可能的话,提供InputStream
or byte[]
反而)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)