gson的 TypeToken

需要解析json,看了gson的文档,发现有Type type= new TypeToken<List<User>>(){}.getType();来获取需要序列化的对象的类信息,这里主要记录两个知识点

一、匿名内部类

什么情况下需要使用匿名内部类?如果满足下面的一些条件,使用匿名内部类是比较合适的:
      a·只用到类的一个实例。
      b·类在定义后马上用到(一般只用一次)。
      c·类非常小(SUN推荐是在4行代码以下)
      d·给类命名并不会导致你的代码更容易被理解。
在使用匿名内部类时,要记住以下几个原则:
      a·匿名内部类不能有构造方法。
      b·匿名内部类不能定义任何静态成员、方法和类。
      c·匿名内部类不能是public,protected,private,static。
      d·只能创建匿名内部类的一个实例。
      e·一个匿名内部类一定是在new的后面,用其隐含实现一个接口或实现一个类。
      f·因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效。
结合本例子:

将需要获取类型的泛型类作为TypeToken的泛型参数构造一个匿名的子类,就可以通过getType()方法获取到我们使用的泛型类的泛型参数类型。不加大括号表示很普通的new一个对象。如果那个类的构造方法是私有的,直接new会编译报错。(这里的构造方法是protect,也无法直接new,是gson获取泛型信息进行内部处理的选择放手)
加上大括号表示你new了一个匿名(内部)类的对象。比如new TypeToken<LinkedList<User>>(){}。表示你new的是一个匿名内部类的对象。这个匿名类继承自TypeToken类。你可以在大括号里面像写其他普通类代码一样随意写代码。
就相当于在方法代码中,直接定义并new 了一个TypeToken的匿名子类。

二、泛型擦除的基础理解

上面的代码我们声明了两个泛型的ArrayList类型,一个泛型的类型参数是String,另外一个是Integer;然后我们输出了两个泛型的Class,并输出两个list的类型是否是同一个list。我们看下输出的结果:

前两个输出都是java.util.ArrayList,而第三个输出竟然是true,也就是认为stringList和intList的类型是一样的。这就是所谓的泛型类型擦除。运行时我们不知道泛型类型的类型参数是什么了。

TypeToken可以解决这个问题,请看下面代码:

注意上面第一行代码使用了一个空的匿名类。第二行使用了resolveType方法解析出泛型类型,第三行代码打印出泛型类型,输出是:

可以看出TypeToken解析出了泛型参数的具体类型。

时间: 2024-10-10 22:25:01

gson的 TypeToken的相关文章

gson json TypeToken

private static Gson gson = new Gson(); public static String toJson(Object object) { return gson.toJson(object); } public static <T> T fromJson(String json, TypeToken<T> token) { return gson.fromJson(json, token.getType()); }

Gson 使用new TypeToken&lt;List&lt;String&gt;&gt;(){}.getType() 为什么有 {}?

前言:使用 gson 时,不明白为什么有这种写法:new TypeToken<List<String>>(){}.getType(),所以来解惑.最终发现其实就是自己的 java 基础没学好.... 1.new TypeToken<List<String>>(){}.getType() 为什么有 {}? 为什么这样就可以new一个不能访问的类对象呢.按照理解,不再同一个包下(Gson下的类),时不能直接new的.但是神奇的是只要加一个{}就可以了. 其实是这

Json2:使用gson解析为List和Map

import java.lang.reflect.Type; import java.util.List; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; public class Json解析成List { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); sb.append("["

Gson和Fastjson

1.PersonBean package com.louis.fastjsondemo; /** * Created by Administrator on 2016/2/26. */ public class PersonBean { private int id; private String name; private String address; public int getId() { return id; } public void setId(int id) { this.id

解析json数组——TypeToken

导包import com.google.gson.reflect.TypeToken; //获取数据 String st=NetWork.geturl(URL); //解析数据 Gson gson=new Gson(); //typetoken解析数组 Type type=new TypeToken<List<GoodVo包>>(){}.getType(); List<Good> list = gson.fromJson(st,type);      

Gson解析POJO类中的泛型参数

在开发Android与API交互的时候,使用Json格式传输,遇到了这样一个情况,返回数据格式POJO类如下: public class ApiResult<T> { private int ret; private String msg; private T data; public int getRet() { return ret; } public void setRet(int ret) { this.ret = ret; } public String getMsg() { ret

使用Gson解析Json

1.Json介绍 JSON的全称是"JavaScript Object Notation",即JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式.XML也是一种数据交换格式.两者的区别:因为XML虽然可以作为跨平台的数据交换格式,但是在JS中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们倾向于选择JSON来交换数据. 2.Json的两种结构 JSON有两种表示结构,对象和数

Gson入门教程

定义一个JavaBean类Person: package ccc.json; public class Person { Integer id; String name; String place; public Person(Integer id, String name, String place) { super(); this.id = id; this.name = name; this.place = place; } public Integer getId() { return

Gson简要使用笔记

本文是我在学图灵机器人的时候发现的一篇文章.我将作者的文章搬过来,并修改了一些自己的东西: 原文链接:http://www.cnblogs.com/lichenwei/p/3987429.html Gson介绍: Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. 常用的2个方法: Gson.toJson(Object src) --将对象进行json序列化 Gson.fro