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

在GSON中使用泛型

濮翰学
2023-03-14
问题内容

我正在使用GSON将JSON解码为T类型的对象,例如

public T decode(String json) {
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>() {}.getType());
}

但是,这将返回异常-

java.lang.AssertionError:意外的类型。预期为以下之一:java.lang.reflect.ParameterizedType,java.lang.reflect.GenericArrayType,但得到:sun.reflect.generics.reflectiveObjects.TypeVariableImpl,类型标记为:T

我认为通过使用TypeToken可以避免Type Erasure。

我错了吗?

谢谢


问题答案:

首先,我看不到像这样包装Gson有什么用。

对于您的问题,有关泛型类型T本身的信息在运行时不可用。它已被删除。它仅在编译时可用。您想使用实际类型来对其进行参数化,例如new TypeToken<List<String>>

如您所见,由于Java中缺少经过修饰的泛型(不可能执行T t = new T()),因此Gson本身被迫使用此TypeToken方法。否则,Gson会以一种更为优雅的方式做到这一点。

为了能够传递实际的类型,您必须重新发明与TypeToken已经做过的相同的事情。这是没有道理的:)只是重复使用它,或者直接使用Gson而不将其包装在这样的辅助类中。



 类似资料:
  • 我正在尝试使用GSON库来正确处理一个名为fromJSON的方法 事实上,我有一些类的一个成员可以使用Java泛型来定义。例如,我可以创建一个等。所以我面临的问题是,我需要告诉GSON它应该使用哪一个T。这里是我在一个问题中运行的地方,因为我的当前代码正在将JSON对象转换为或,但是泛型对象不被视为、等,它只是被转换为。 我尝试了一些我在Stackoverflow中找到的答案,但我仍然无法得到正确

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

  • 我在Android应用程序中实现Json反序列化时遇到了一些问题(带有Gson库)

  • 问题内容: 我正在使用GSON 1.4,并使用两个通用对象序列化对象,如下所示 。当我对它进行反序列化时 可悲的是我得到了 java.lang.IllegalArgumentException:无法将java.util.ArrayList字段…设置为java.util.LinkedList 这是为什么 ?GSON文档指出,如果我使用object.class参数进行序列化,则它支持泛型。任何想法?谢

  • 简短说明: 我在将mongo DB中的文档读入具有泛型属性的java类时遇到了困难。错误显示 ...但是当我试着从数据库里读... ...我得到以下异常: 我确实发现了一些关于泛型和morphia的讨论,但老实说,我不知道如何将这些应用到我的问题上。 我在运行Morphia 1.5.8

  • 我有一个Api,Api如下所示: 如果响应是ok,那么结构将以关键字开头,例如: 问题是:我如何为父类创建一个反序列化器,它也会反序列化子类(作为我的第二种方法),或者我如何用Gson创建一个泛型类,这样包装在周围的每个tyoe都可以与它一起使用,比如: public class DataObjectDeserializer implements JsonDeserializer{