前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
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