java - 将 JSON 脚本转换为 MAP 时使用的 java 中的 TypeReference 是什么
问题描述
在转换从 api 响应收到的 JSON 时,我遇到了 TypeRef,但我不确定它是如何工作的?任何图形表示或简化版本都会很好。我读过,但仍然不是很清楚。就像我们有地图来存储 <K,V> 但是 TypeRef 会对对象有什么不同呢?
TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {};
解决方案
这TypeReference<T> implements Comparable<TypeReference<T>>
是jackon
图书馆的一部分。这是com.fasterxml.jackson.core.type
. 从API 文档:
该泛型抽象类用于通过子类化获取完整的泛型类型信息;它必须转换为 ResolvedType 实现(由“databind”包中的 JavaType 实现)才能使用。课程基于来自 http://gafter.blogspot.com/2006/12/super-type-tokens.html的想法,其他想法(来自文章评论中提出的建议)是要求 Comparable 的虚假实现(任何这样的通用接口可以做到,只要它强制实现具有通用类型的方法)。以确保确实给出了 Type 参数。用法是通过子类化:这是实例化对泛型类型 List 的引用的一种方法:
TypeReference ref = new TypeReference<List>() { }; 它可以传递给接受 TypeReference 的方法,或者使用 TypeFactory 解析以获得 ResolvedType。
这主要用于反序列化 JSON 对象的 Generic 类型,例如 JAVA Collection 对象,如下所示:
public List<Double> getDoubleList() {
return getObjectFromJson(new TypeReference<List<Double>>() {
});
}
public <T> T getObjectFromJson(String jsonString, final TypeReference<T> typeReference) {
try {
return new ObjectMapper().readValue(jsonString, typeReference);
} catch (JsonProcessingException e) {
// TODO
}
}
推荐阅读
- vb.net - 覆盖应用程序类中的可见值,然后显示主窗体导致堆栈溢出
- stl - 将向量的内容复制到多重集中
- python - Python中的R函数geom_freqpoly等价于绘制频率多边形
- perl - 如何在 Perl 5 中保留 unicode 逗号?
- python - 用pypy运行flask时如何解决这个错误?
- node.js - 错误:ENOENT:没有这样的文件或目录,
- javascript - Node.js - 为什么 JSON.parse 会混淆响应正文中的对象?
- google-bigquery - Bigquery 中的 ARRAY OF STRUCT 中的 DISTINCT
- javascript - vueJS,超时不等待计时器
- c++ - 如何在 Qt 中正确中止网络请求?