当前位置: 首页 > 面试题库 >

与Gson一起使用通用类型

齐运诚
2023-03-14
问题内容

我正在尝试创建一个通用类以与Google Gson一起使用。我已经创建了课程GsonJsonConverterImplementation<T>。此类具有以下方法:

public T deserialize(String jsonString) {
    GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat("MM/dd/yy HH:mm:ss");

    Gson gson = builder.create();
    return gson.fromJson(jsonString, T); // T.class etc. what goes here
}

目标是该方法应该能够与我设置了GsonJsonConverterImplementation的任何Type一起使用。不幸的是,gson.fromJson(jsonString, T)它不起作用,也不能T.class代替T 使用。我确信问题是由于我对Java泛型类型缺乏理解而引起的。在Gson上使用泛型的正确方法是什么?

使用Kris的答案进行 编辑,我认为这应该可行。不幸的是,clazz无法以这种方式使用,并且会导致编译器错误。在使用Gson的集合和泛型时,我有哪些选择?

public List<T> deserializeList(String jsonString, Class<T> clazz) {
    GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat("MM/dd/yy HH:mm:ss");
    Gson gson = builder.create();

    Type listType = new TypeToken<clazz>(){}.getType(); // compiler error

    return gson.fromJson(jsonString, listType);
}

问题答案:

您尝试的最简单方法是定义要在方法签名本身中返回的类的类型。您可以通过将’T’的实例传递给方法或要返回的值的Class来实现。在您希望生成返回值的情况下,第二种方法更为典型。这是使用Gson的这种方法的示例:

public <T> T deserialize(String jsonString, Class<T> clazz) {
    GsonBuilder builder = new GsonBuilder();
    builder.setDateFormat("MM/dd/yy HH:mm:ss");

    Gson gson = builder.create();
    return gson.fromJson(jsonString, clazz);
}

用法:

MyClass mc = deserialize(jsonString, MyClass.class);


 类似资料:
  • 问题内容: 我正在处理一些服务器代码,其中客户端以JSON形式发送请求。我的问题是,有许多可能的请求,每个请求的实现细节都不尽相同。因此,我想使用一个Request接口,它定义为: 从那里,我在名为如下的类中实现了接口: 为了使用JSON,我创建了一个实例并注册了一个,如下所示: 然后,如下面的代码片段所示,我使用了它: 我得到了预期的输出。 我希望做的是用类似于以下内容的内容替换该行,但是这样做

  • 我的适配器 我的持有者 类myHolder(itemView:View):recyclerview.viewholder(itemView){} 第二个 提前致谢

  • 泛型lambdas能利用“替换失败不是错误”规则吗?例子 是否有任何解决方法或计划将其包含在语言中?此外,由于通用lambda是引擎盖下的模板化函数对象,因此无法做到这一点不是有点奇怪吗?

  • 问题内容: 我在Android应用程序(带有Gson库)中实现Json反序列化存在一些问题 我已经上了这样的课 反序列化的调用是: 问题是调用后的result.posts列表包含一个LinkedTreeMap对象数组(具有正确的值,因此问题是反序列化)而不是MyJson对象。当我使用MyObject而不是T时,一切运行正常并且MyObject是正确的。 那么,有什么方法可以在不创建自定义反序列化器

  • 无法从自定义类获取泛型类型列表(Turns): 它说:

  • 当试图将EnumTypeAdapter与Proguard一起使用时,它会在gson.getAdapter()中导致AssertionError。此错误似乎是由于类型信息丢失...以下是所有相关源代码: 例外情况: 正在使用的EnumTypeAdapter: 如何构造GSON对象: 我的ProGuard配置: 如前所述,我怀疑由于丢失了类型信息而出现了故障--在深入研究了GSON源代码后,这是用来解