簡體   English   中英

創建動態類型列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM