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

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。

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

  • 23
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值