java中的TypeReference是什么,在将JSON脚本转换为MAP时使用

Kav*_*rni 8 java json

在转换从 api 响应收到的 JSON 时,我遇到了 TypeRef,但我不确定它是如何工作的?任何图形表示或简化版本都可以。我读过,但还是不太清楚。就像我们有映射来存储 <K,V> 但是 TypeRef 对对象会有什么不同呢?

TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {};
Run Code Online (Sandbox Code Playgroud)

gea*_*uch 10

在 Java 中,泛型或多或少在运行时消失了。这称为类型擦除。所以当你的程序运行时你HashMap<String, Object>就会这样HashMap<?, ?>。所以杰克逊无法确定类型StringObject。这就是为什么您必须创建一个TypeReference在运行时保留该信息的原因,以便 Jackson 可以将您的 JSON 字符串反序列化为正确的类。

如果您没有指定类型,Jackson 仍然能够正确地反序列化简单的对象,例如String或 数字,但是当遇到更复杂的对象时,它只会将它们反序列化,当您尝试访问反序列化的对象时,LinkedHashMap很可能会导致ClassCastException目的。


Gau*_*ani 5

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 的虚假实现(任何只要它强制实现具有泛型类型的方法,这样的泛型接口就可以了)。确保确实给出了类型参数。用法是通过子类化:这是实例化对泛型类型列表的引用的一种方法:

TypeReference ref = new TypeReference<List>() { }; 可以传递给接受 TypeReference 的方法,或者使用 TypeFactory 解析以获得 ResolvedType。

这主要用于反序列化通用类型的 JSON 对象,例如 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
  }
}
Run Code Online (Sandbox Code Playgroud)