2014-06-18 78 views
0

我試圖使用GSON libraryGSON使用Java泛型

public <T> T fromJSON(String object, Class<T> classObject) 
{ 
    return gson.fromJson(object, classObject); 
} 

的事實得到正確的名爲fromJSON方法是,我有一個成員都可以使用Java泛型來定義一些類。例如,我可以創建一個new ValidationResult<User>(), ValidationResult<Image>() or ListResult<User>(), ListResult<Image>()等等,所以我面臨的問題是我需要告訴GSON它應該使用哪個。這是我在某個問題中運行的位置,因爲我當前的代碼正在將JSON對象轉換爲ValidationResultListResult,但該通用對象不被視爲UserImage等。它只是被轉換爲LinkedTreeMap

我嘗試了一些我在Stackoverflow中找到的答案,但我仍然無法弄清楚。

Using a generic type with Gson
Google Gson - deserialize list<class> object? (generic type)
Deserializing Generic Types with GSON

能有人把自己在正確的道路?如果可能的話,分享一些我可以用作指導的代碼。

+0

聲明你的'fromJson'方法的類是否有類型參數'T'? –

+1

所以這是一個通用的方法嗎?你必須在使用它之前聲明類型,嘗試'public T fromJSON(String object,Class classObject)' – neevek

+0

@SotiriosDelimanolis它沒有因爲我不想每次創建一個新的實例我想要使用fromJSON方法與不同的類。 – Proverbio

回答

1

由於類型擦除ValidationResultValidationResult<User>是相同的類型。這種類型只會有一個Class對象。因爲Gson只通過那個Class對象知道ValidationResult,所以它必須使用通用類型的默認值。在這種情況下,它使用LinkedHashMap

最簡單的解決方案是提供一個TypeToken,這是一種破解類型擦除(但不是真的)的方法。您可以像這樣使用它

gson.fromJson(json, new TypeToken<ValidationResult<User>>() {}.getType()); 

通過Type,Gson可以訪問泛型類型參數。請注意,我如何硬編碼User作爲參數。你必須在這裏使用一個實際的類型讓Gson得到實際的類型。如果您使用泛型類型參數,則Gson將獲得泛型類型參數作爲值,並且不會再知道如何使用它。我解釋了爲什麼here

另一種解決方案是創建的ValidationResult亞型像

public class UserValidationResult extends ValidationResult<User> {} 

和該Class對象傳遞到您的方法。