您的位置:首页 > 移动开发

new TypeToken<List<AppVersion>>(){}.getType()是什么意思

2017-02-22 18:14 1371 查看
1.  项目中代码:List<AppVersion> redisList = new Gson().fromJson(json, new TypeToken<List<AppVersion>>(){}.getType());

2.   fromJson方法就是下面这个方法,将一个Json数据转换为对象。

提供两个参数,分别是json字符串以及需要转换成对象的类型。

在我们项目中是把Json格式的数据转换成List<AppVersion> 类型。

@SuppressWarnings("unchecked")
public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException {
if (json == null) {
return null;
}
StringReader reader = new StringReader(json);
T target = (T) fromJson(reader, typeOfT);
return target;
}

3.  new TypeToken<List<AppVersion>>(){}.getType()  ,这个位置要的参数是一个Type,表示是xxx类型,但是Type是个接口,如下:

public interface Type {
/**
* Returns a string describing this type, including information
* about any type parameters.
*
* @implSpec The default implementation calls {@code toString}.
*
* @return a string describing this type
* @since 1.8
*/
default String getTypeName() {
return toString();
}
}

new XXX();  这样是一个构造函数,但是接口是不能直接new的,所以这时用到了匿名内部类,实现接口成为一种具体的类型。

TypeToken,它是gson提供的数据类型转换器,可以支持各种数据集合类型转换。


先调用TypeToken<T>的构造器得到匿名内部类,再由该匿名内部类对象调用getType()方法得到要转换成的type,

在此就是得到的type就是列表类型:List<AppVersion>类型。

  new TypeToken<List<AppVersion>>(){}.getType()  就是说要把Json数据转换成List<AppVersion>类型的结果。

4.
匿名内部类使用还有如:


new TypeToken<LinkedList<User>>(){}匿名内部类常用在监听里面,比如我们给一个按钮加监听:
JButton btn = new JButton("test");
btn.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

}
});

 btn.addActionListener()方法接受的是一个ActionListener类型的对象,而ActionListener是一个接口,不能直接new。

所以本来这里该写一个类实现ActionListener接口,然后给他传参为实现类对象,

但是太麻烦了,我们直接在这里创建了那个实现类,之所以叫匿名,就是因为new的时候实现为一个类就直接调方法了,根本没有给这个类取名。

5. Gson提供的fromJson()方法是实现从Json数据到Java实体的方法,可以把Json数据转成单一实体对象类型、对象列表类型、其他结构类型。

比如:

 第一种   json字符串为:[{“name”:”name0”,”age”:0}]  转成Person类型:
Person person = gson.fromJson(str, Person.class);
1
1

 第二种,转换成列表类型:
List<Person> ps = gson.fromJson(str, new TypeToken<List<Person>>(){}.getType());


6. 出现问题:将整形数字1存入json串,经gson解析后,可能会变成1.0,这时要用第二种转换方式。才会得到我们想要的整形1。

参考:http://blog.csdn.net/alexxu1988/article/details/46685433

    http://blog.csdn.net/jonemill/article/details/39084809
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐