当前位置: 首页 > 知识库问答 >
问题:

使用Java泛型的GSON

江智
2023-03-14

我正在尝试使用GSON库来正确处理一个名为fromJSON的方法

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

事实上,我有一些类的一个成员可以使用Java泛型来定义。例如,我可以创建一个新的validationresult ()、validationresult ()或listresult ()、listresult () 等。所以我面临的问题是,我需要告诉GSON它应该使用哪一个T。这里是我在一个问题中运行的地方,因为我的当前代码正在将JSON对象转换为validationresultlistresult,但是泛型对象不被视为userimage等,它只是被转换为LinkedTreeMap

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

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

共有1个答案

巫新知
2023-03-14

由于erasure类型,validationresultvalidationresult 是同一类型。该类型只能有一个class对象。因为Gson只通过class对象了解validationresult,所以它必须为泛型类型使用默认值。在本例中,它使用LinkedHashMap

最简单的解决方案是提供typeToken,这是一种绕过类型擦除的方法(但实际上不是)。您可以这样使用它

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

通过type,Gson可以访问泛型类型参数。请注意我是如何将user类型硬编码为参数的。您必须在这里使用一个实际类型来使Gson获得实际类型。如果使用泛型类型参数,Gson将获得一个泛型类型参数作为值,并且仍然不知道如何使用它。我在这里解释原因。

public class UserValidationResult extends ValidationResult<User> {}
 类似资料:
  • 问题内容: 我有一个代表文本片段的泛型类。该文本片段可能具有多种不同模式(突出显示的不同类型)中的任何一种。这些模式用枚举表示。每个项目的Enum可能不同,但是它必须实现一个接口,该接口提供了一种将其中两个结合的方法(可以突出显示并加粗显示)。所以我有一个界面: 然后我的TextFragment是文本字符串和模式的容器。但是当我尝试声明该类时: 我收到以下错误: 令牌“扩展”的语法错误,预期 根据

  • 我有一个下面的课: } 我的所有类都有一个名为ID的属性,它是类型UUID,所以比较器应该可以在所有泛型类型中正常工作。问题是我不知道如何编写collectors.groupingby的函数和supplier代码,因为第二个代码片段给出了编译错误。

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 我试图了解类泛型的工作原理,这对我来说毫无意义。 因此,例如,如果我有以下课程: 然后我尝试 go方法不应该接受A或A的任何子类吗? 谢谢 :) 问题答案: 这样做的原因是基于Java如何实现泛型的。 数组示例 使用数组可以做到这一点(数组是协变的,正如其他人解释的那样) 但是,如果您尝试这样做会发生什么? 最后一行可以正常编译,但是如果您运行此代码,则可能会得到一个。因为您正在尝试将

  • 编译时,此代码将产生以下+错误: 问题是访问中的类型T与列表中的T不相同。如何修复此编译问题?