天天看點

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