【问题标题】:GSON using Java genericsGSON 使用 Java 泛型
【发布时间】:2014-06-18 05:34:08
【问题描述】:

我正在尝试正确使用 GSON library 调用 fromJSON 的方法

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

事实上,我有一些类可以使用 Java 泛型定义一个成员。例如,我可以创建一个new ValidationResult&lt;User&gt;(), ValidationResult&lt;Image&gt;() or ListResult&lt;User&gt;(), ListResult&lt;Image&gt;(),等等......所以我面临的问题是我需要告诉 GSON 它应该使用哪个 T。这是我遇到问题的地方,因为我当前的代码正在将 JSON 对象转换为ValidationResultListResult,但通用对象不被视为UserImage 等。它只是例如转换为LinkedTreeMap

我尝试了一些在 Stackoverflow 中找到的答案,但我仍然无法正确回答。

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

有人可以让自己走上正确的道路吗?如果可能的话,分享一些我可以用作指导的代码。

【问题讨论】:

  • 声明fromJson方法的类是否有类型参数T
  • 所以这是一个通用方法对吧?你必须在使用前声明类型,试试public &lt;T&gt; T fromJSON(String object, Class&lt;T&gt; classObject)
  • @SotiriosDelimanolis 它没有 因为我不想在每次想将 fromJSON 方法与不同的类一起使用时创建一个新实例。
  • 然后按照@neevek 的建议做,使方法通用。
  • 感谢 SotiriosDelimanolis 和 @neevek。问题已更新。 GSON 仍然忽略类型。例如,我应该如何传递 ValidationResult

标签: java


【解决方案1】:

因为类型擦除,ValidationResultValidationResult&lt;User&gt; 是同一类型。该类型只会有一个 Class 对象。因为 Gson 只通过 Class 对象知道 ValidationResult,所以它必须使用泛型类型的默认值。在这种情况下,它使用LinkedHashMap

最简单的解决方案是提供TypeToken,这是一种绕过类型擦除的技巧(但不是真的)。你可以这样使用它

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

通过Type,Gson 可以访问泛型类型参数。请注意我是如何将类型 User 硬编码为参数的。您必须在此处为 Gson 使用实际类型才能获取实际类型。如果使用泛型类型参数,Gson 将获取泛型类型参数作为值,并且再次不知道如何使用它。我解释了为什么here

另一种解决方案是创建ValidationResultlike 的子类型

public class UserValidationResult extends ValidationResult<User> {}

并将 Class 对象传递给您的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多