前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >new TypeToken<List>>(){}.getType() 是什么意思

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

作者头像
微风-- 轻许--
发布2022-04-13 09:12:25
1.1K0
发布2022-04-13 09:12:25
举报
文章被收录于专栏:java 微风

1. 项目中代码:

代码语言:javascript
复制
List<AppVersion> redisList = new Gson().fromJson(json, new TypeToken<List<AppVersion>>(){}.getType());

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

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

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

代码语言:javascript
复制
@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是个接口,如下:

代码语言:javascript
复制
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. 匿名内部类使用还有如:

代码语言:javascript
复制
<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 类型:

代码语言:javascript
复制
Person person = gson.fromJson(str, Person.class);

第二种,转换成列表类型:

代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/02/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档