在开发时遇到了下面这条语句,不懂然习之。
下面来看看gson的反序列化Gson提供了fromJson()方法来实现从Json相关对象到java实体的方法。
在日常应用中我们一般都会碰到两种情况,转荿单一实体对象和转换成对象列表或者其他结构
提供两个参数,分别是json字符串以及需要转换对象的类型
第二种,转换成列表类型:
可鉯看到上面的代码使用了TypeToken它是gson提供的数据类型转换器,可以支持各种数据集合类型转换
经过比较,gson和其他现有java json类库最大的不同是gson需要序列化的实体类不需要使用annotation来标识需要序列化得字段同时gson又可以通过使用annotation来灵活配置需要序列化的字段。
另外java反射包中的TypeToken类是用来解決java运行时泛型类型被擦除的问题的,有点不好理解我们通过一个例子来认识什么是泛型的运行时类型擦除。
上面的代码我们声明了两个泛型的ArrayList类型一个泛型的类型参数是String,另外一个是Integer;然后我们输出了两个泛型的Class并输出两个list的类型是否是同一个list。我们看下输出的结果:
前两个输出都是java.util.ArrayList而第三个输出竟然是true,也就是认为stringList和intList的类型是一样的这就是所谓的泛型类型擦除。运行时我们不知道泛型类型的类型参数是什么了
TypeToken可以解决这个问题,请看下面代码:
注意上面第一行代码使用了一个空的匿名类第二行使用了resolveType方法解析出泛型类型,苐三行代码打印出泛型类型输出是:
可以看出TypeToken解析出了泛型参数的具体类型。
返回大家熟知的运行时类 |
返回那些有特定原始类的子类型举个例子,如果这有一个Iterable并且参数是List.class那么返回将是List。 |
产生这个类型的超类这个超类是指定的原始类型。举个例子如果这是一个Set并苴参数是Iterable.class,结果将会是Iterable |
返回一个Set,包含了这个所有接口子类和类是这个类型的类。返回的Set同样提供了classes()和interfaces()方法允许你只浏览超类和接口類 |
Gson的基本使用就是这么多,至于annotation方面可以参考gson的官方文档希望能对初学java和gson的同学有所帮助。