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. 匿名内部类使用还有如:
<span style="color:#333333">new TypeToken<LinkedList<User>>(){}
匿名内部类常用在监听里面,比如我们给一个按钮加监听:
JButton btn = new JButton("test");
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});</span>
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);
第二种,转换成列表类型:
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