[英]GSON using Java generics
我正在嘗試使用GSON庫糾正稱為fromJSON的方法
public <T> T fromJSON( String object, Class<T> classObject )
{
return gson.fromJson( object, classObject );
}
事實是我有一些類可以使用Java泛型定義一個成員。 例如,我可以創建一個new ValidationResult<User>(), ValidationResult<Image>() or ListResult<User>(), ListResult<Image>()
等...,所以我面臨的問題是我需要告訴GSON應該使用哪個T。 這是我遇到問題的地方,因為我當前的代碼將JSON對象轉換為ValidationResult
或ListResult
,但是該通用對象沒有被視為User
, Image
等。它只是轉換為LinkedTreeMap
例如。
我嘗試了一些在Stackoverflow中找到的答案,但仍然無法正確解決。
與Gson一起使用通用類型
Google Gson-反序列化list <class>對象? (通用類型)
使用GSON反序列化通用類型
有人可以讓自己走對路嗎? 如有可能,請分享一些我可以用作指導的代碼。
由於類型擦除, ValidationResult
和ValidationResult<User>
是同一類型。 該類型將永遠只有一個Class
對象。 由於Gson僅通過該Class
對象知道ValidationResult
,因此它必須對默認類型使用默認值。 在這種情況下,它使用LinkedHashMap
。
最簡單的解決方案是提供TypeToken
,這是解決類型擦除的一種技巧(但並非如此)。 您可以像這樣使用
gson.fromJson(json, new TypeToken<ValidationResult<User>>() {}.getType());
通過Type
,Gson可以訪問泛型type參數。 注意我如何將類型User
硬編碼為參數。 您必須在此處使用實際類型,Gson才能獲取實際類型。 如果您使用通用類型參數,Gson將獲得一個通用類型參數作為值,並且將再次不知道如何使用它。 我在這里解釋為什么。
另一種解決方案是創建ValidationResult
的子類型,例如
public class UserValidationResult extends ValidationResult<User> {}
並將其Class
對象傳遞給您的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.