[英]Creating lists of dynamic types
所以,我現在正在努力弄清楚如何解析大量不同的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世界的新手,所以我還在學習該語言的內外版本。 如果有人能給我一些關於如何實現我想要的東西的提示,那將會非常有幫助。 謝謝。
答案是:由於類型擦除,你無法做你在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);
}
但你不能,因為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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.