在开发时,遇到了下面这条语句,不懂,然习之。

 
private List<MyZhuiHaoDetailModel> listLottery = new ArrayList<MyZhuiHaoDetailModel>();

 

Gson gson=new Gson();

JSONObject object=new JSONObject(callbackValue);

 

listLottery =  gson.fromJson(object.getString("lists"),

new TypeToken<List<MyZhuiHaoDetailModel>>() {

}.getType());

 

GSON提供了 TypeToken 这个类来帮助我们捕获(capture)像List<MyZhuiHaoDetailModel>这样的泛型信息。上文创建了一个匿名内部类,这样,Java编译器就会把泛型信息编译到这个匿名内部类里,然后在运行时就可以被 getType()方法用反射API提取到。 下面来看看gson的反序列化,Gson提供了fromJson()方法来实现从Json相关对象到java实体的方法。 在日常应用中,我们一般都会碰到两种情况,转成单一实体对象和转换成对象列表或者其他结构。 先来看第一种: 比如json字符串为:{"name":"name0","age":0} 代码: Person person = gson.fromJson(str, Person.class);提供两个参数,分别是json字符串以及需要转换对象的类型。 第二种,转换成列表类型: 代码:
List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());

for(int i = 0; i < ps.size() ; i++)

{

     Person p = ps.get(i);

     System.out.println(p.toString());

}

可以看到上面的代码使用了TypeToken,它是gson提供的数据类型转换器,可以支持各种数据集合类型转换。 经过比较,gson和其他现有java json类库最大的不同是gson需要序列化的实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段。 另外,java反射包中的TypeToken类是用来解决java运行时泛型类型被擦除的问题的,有点不好理解,我们通过一个例子来认识什么是泛型的运行时类型擦除。
 ArrayList<String> stringList = Lists.newArrayList();  

       ArrayList<Integer> intList = Lists.newArrayList();        

       System.out.println("intList type is " + intList.getClass());    

      System.out.println("stringList type is " + stringList.getClass());  

      System.out.println(stringList.getClass().isAssignableFrom(intList.getClass()));

相关文章:

  • 2021-11-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-26
  • 2021-11-24
  • 2021-07-25
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-10-21
  • 2021-09-20
  • 2022-12-23
  • 2021-05-24
相关资源
相似解决方案