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