使用过Gson的同学都知道在反序列化时需要定义一个TypeToken类型,像这样 代码语言:javascript 复制 privateType type=newTypeToken<List<Map<String,Foo>>>(){}.getType();//调用fromJson方法时把type传过去,如果type的类型和json保持一致,则可以反序列化出来gson.fromJson(json,type); 三个问题 为什么要用TypeToken...
将Type对象传递给gson的fromJson()或toJson()方法,例如: 代码语言:txt 复制 List<String> list = gson.fromJson(json, type); 上述代码将json字符串转换为List<String>类型的对象。 使用泛型的TypeToken可以解决在gson中无法直接获取泛型类型的问题,使得gson可以正确地序列化和反序列化泛型类型的对象。 推荐的腾讯...
TypeToken是Gson库中的一个辅助类,用于在运行时创建泛型类型的Type实例。由于Java的类型擦除机制,泛型类型信息在编译时会被擦除,因此无法直接通过反射获取泛型类型。而TypeToken通过继承一个具体的泛型类(通常是Object),并使用匿名内部类的方式,在运行时保留了泛型类型信息。 2. 创建一个泛型类作为示例 首先,我们创建...
但上面调用过程中会有一个问题,就是获取的response对象中body属性是LinkedHashMap,原因是gson反序列化时是通过method.getReturnType()来获取返回类型的,而返回类型中的泛型会被擦除掉。 要解决这个问题也很简单,和上面TypeToken一样的道理,定义一个空类PersonResponse来继承Response<PersonInfo>,然后将返回类型定义为Per...
TestGeneric t1=GsonUtils.gson.fromJson(gStr, type); System.out.println(t1.getValue()); TypeToken的使用非常简单,如上面的代码,只要将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型。
可以发现,代码能跑起来,但是Body变成了LinkedHashMap类型,这是因为传给gson的类型是Response.class,gson并不知道body属性是什么类型,那它只能使用LinkedHashMap这个默认的json对象类型了。 这就是TypeToken由来的原因,对于带泛型的类,使用TypeToken才能得到准确的类型信息,那TypeToken是怎么取到准确的类型的呢?
可以发现,代码能跑起来,但是Body变成了LinkedHashMap类型,这是因为传给gson的类型是Response.class,gson并不知道body属性是什么类型,那它只能使用LinkedHashMap这个默认的json对象类型了。 这就是TypeToken由来的原因,对于带泛型的类,使用TypeToken才能得到准确的类型信息,那TypeToken是怎么取到准确的类型的呢?
import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.List; public class TestFanXing { public class BBQ{ private int id; private String name; } public static void main(String[] args){ String jsonData = "{\"id\": 1, \"name\": \"黄磊\"}"; ...
(1) 如果需要把json字符串 转成 集合这样复杂的类型, 需要使用gson提供的一个类 (2) TypeToken , 是一个自定义泛型类, 然后通过TypeToken来指定我们需要转换成的类型 com.google.gson.reflectimport java.lang.reflect.Type;import java.util.ArrayList;import java.util.HashMap;import java.util.List;public cla...
gson的 TypeToken 需要解析json,看了gson的文档,发现有Type type= new TypeToken<List<User>>(){}.getType();来获取需要序列化的对象的类信息,这里主要记录两个知识点 一、匿名内部类 什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:...