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