2014-02-19 167 views
0

因此,我正在努力弄清楚如何解析大量不同的JSON對象,而不必硬編碼函數來序列化和反序列化每個對象。我開始使用Gson,這一直工作得很好。儘管當我嘗試使用對象列表時,問題開始出現。創建動態類型列表

我想創建一個函數,可以使用我的任何數據模型對象,我可以傳遞一個JSONArray和JSON包含的類類型,這樣我就可以看到類似這樣的調用 -

response = JSONHelper.createObjectList(jsonArray, DataObject.class); 

順便說一句,我不是從我的開發機發布,所以請原諒我,如果在我的代碼中有幾個拼寫錯誤。

我試圖寫這樣的事情(我JSONHelper類中)來創建效果 -

public List createObjectList(JSONArray jsonArray, Class type) { 
    Gson gson = new Gson(); 

    Type listType = new TypeToken<List<type>>() {}.getType(); 

    List<type> data = gson.fromJson(jsonArray, listType); 

    return data; 
} 

好了,顯然這是不工作的代碼,但就是有點我怎麼想成爲能夠得到這個工作。我嘗試了幾種不同的方式和變化,但我一直無法弄清楚任何能夠很好地工作的東西。

我是新來的Android/Java世界,所以我仍然在學習語言的輸入和輸出。如果有人可以給我一些關於如何實現我所期望的技巧,這將會非常有幫助。謝謝。

回答

2

答案是:由於類型擦除,你不能做你想在Java中做的事情。

這就是原因你必須使用TypeToken並傳遞到Type GSON的fromJson()方法;運行時T的類型信息不可用。 Java中的泛型大部分只是編譯時類型檢查。

理想情況下,你希望能夠做到這一點:

public <T> List<T> createList(JsonArray a, Class<T> clazz) 
{ 
    Type t = new TypeToken<List<T>>(){}.getType(); 
    return new Gson().fromJson(a, t); 
} 

但是你不能,因爲ŧ被擦除。如果你嘗試這個,你會發現結果令人困惑;你得到一個List回來,但它不會實際上包含你的類並拋出一個轉換異常。

實際上,你的方法就必須是這樣的:

public <T> List<T> createList(JsonArray a, Type t) 
{ 
    List<T> list = new Gson().fromJson(a, t); 
    return list; 
} 

這當然是愚蠢的,因爲你現在打電話給你寫的,而不是僅僅調用GSON方法的方法。

編輯補充:

關於它的思考,有辦法解決這對List類型。您可以使用數組:

public <T> List<T> createList(JsonArray a, Class<T[]> c) 
{ 
    T[] array = new Gson().fromJson(a, c); 
    return Arrays.asList(array); 
} 

因爲你不是試圖依靠泛型類型從一個List,而是在傳遞一個數組類型的類...它的工作原理。有點凌亂,但它的作品:

List<MyPojo> list = createList(a, MyPojo[].class);