在开发时,遇到了下面这条语句,不懂,然习之。
privateList<MyZhuiHaoDetailModel>listLottery=newArrayList<MyZhuiHaoDetailModel>();
Gsongson=newGson();
JSONObjectobject=newJSONObject(callbackValue);
listLottery=gson.fromJson(object.getString("lists"),
newTypeToken<List<MyZhuiHaoDetailModel>>(){
}.getType());
GSON提供了TypeToken这个类来帮助我们捕获(capture)像List<MyZhuiHaoDetailModel>这样的泛型信息。上文创建了一个匿名内部类,这样,Java编译器就会把泛型信息编译到这个匿名内部类里,然后在运行时就可以被getType()方法用反射API提取到。
下面来看看gson的反序列化,Gson提供了fromJson()方法来实现从Json相关对象到java实体的方法。
在日常应用中,我们一般都会碰到两种情况,转成单一实体对象和转换成对象列表或者其他结构。
先来看第一种:
比如json字符串为:{"name":"name0","age":0}
代码:
Personperson=gson.fromJson(str,Person.class);
提供两个参数,分别是json字符串以及需要转换对象的类型。
第二种,转换成列表类型:
代码:
List<Person>ps=gson.fromJson(str,newTypeToken<List<Person>>(){}.getType());
for(inti=0;i<ps.size();i++)
{
Personp=ps.get(i);
System.out.println(p.toString());
}
可以看到上面的代码使用了TypeToken,它是gson提供的数据类型转换器,可以支持各种数据集合类型转换。
经过比较,gson和其他现有javajson类库最大的不同是gson需要序列化的实体类不需要使用annotation来标识需要序列化得字段,同时gson又可以通过使用annotation来灵活配置需要序列化的字段。
另外,j
stringList=Lists.newArrayList();
intList=Lists.newArrayList();
println("intListtypeis"+intList.getClass());
println("stringListtypeis"+stringList.getClass());
println(stringList.getClass().isAssignableFrom(intList.getClass()));
上面的代码我们声明了两个泛型的
intListtype
前两个输出都是
TypeToken可以解决这个问题,请看下面代码:
typeTokengetTypeParametersprintln(genericTypeToken.getType());
注意上面第一行代码使用了一个空的匿名类。第二行使用了resolveType方法解析出泛型类型,第三行代码打印出泛型类型,输出是:
classjava.lang.String
可以看出TypeToken解析出了泛型参数的具体类型。
TypeToken的方法列表如下:
方法
描述
getType()
获得包装的java.lang.reflect.Type.
getRawType()
返回大家熟知的运行时类
getSubtype(Class<?>)
返回那些有特定原始类的子类型。举个例子,如果这有一个
getSupertype(Class<?>)
产生这个类型的超类,这个超类是指定的原始类型。举个例子,如果这是一个
isAssignableFrom(type)
如果这个类型是
getTypes()
返回一个
isArray()
检查某个类型是不是数组,,甚至是<?extendsA[]>。
getComponentType()
返回组件类型数组。
Gson的基本使用就是这么多,至于annotation方面可以参考gson的官方文档,希望能对初学java和gson的同学有所帮助。
那绿叶上的水珠,是思念的泪滴。