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

使用gson反序列化时将TypeToken转换为Type时出错

微生耘豪
2023-03-14

我有一个类,它用这个函数反序列化泛型的ArrayList,就像这个线程的第一个答案中描述的:Java抽象类函数泛型类型

public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data,   TypeToken.get(new ArrayList<T>().getClass()));
}

Eclipse要求我强制转换TypeToken,结果如下(sinde fromJson的函数需要一个类型,而不是一个TypeToken)

public <T> ArrayList<T> arrayType(String data){
    return g.fromJson(data,  (Type) TypeToken.get(new ArrayList<T>().getClass()));
}

结果我得到了这个错误:

java.lang.ClassCastException: com.google.gson.reflect.TypeToken cannot be cast to java.lang.reflect.Type

在gson用户手册中,他们告诉您这是调用函数的正确方式

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);

我看不出我做错了什么(如果它是一个有效的答案,为什么我会得到这个cast错误?)

共有1个答案

束雅达
2023-03-14

您正在调用TypeToken.get,它返回一个TypeToken-而不是Type。在您展示的示例中,它使用了TypeToken.getType(),它返回一个类型

因此可以使用:

return g.fromJson(data, TypeToken.get(new ArrayList<T>().getClass()).getType());

...这将返回一个类型,但它可能不是您真正想要的。特别是,由于类型擦除,无论您从调用站点指定什么t,它都将返回相同的类型。如果您希望类型真正反映arraylist ,您需要将类传递到方法中,尽管我不完全确定从那里去哪里。(根据我的经验,Java反射API在泛型方面并不十分清晰。)

另外,我希望一个名为arraytype的方法与数组有关,而不是arraylist

 类似资料:
  • 由于Realm无法处理升级类型,包括s,所以我正试图实现一个,就像这个问题一样。 问题是,我对为什么会出现以下错误感到困惑: W/系统。呃:com。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN_对象,但为字符串 这是Json的一部分: 我的RealmString: 改装Pojo的一部分: 以及反序列化程序: 我在

  • 在我的spark代码中有gson,它存储在字符串RDD中,我将其转换为键和值。 (1). (2). 但我收到了以下错误消息。谷歌。格森。JsonSyntaxException:java。伊奥。EOFEException:com第1行第2列的输入结束。谷歌。格森。格森。com上的fromJson(Gson.java:813)。谷歌。格森。格森。com上的fromJson(Gson.java:768)

  • 我正在使用gson进行改造,将json反序列化为领域对象。这在大多数情况下都很有效。处理问题时会出现麻烦 RealmList(字符串(或任何其他基本数据类型)) 由于Realm不支持RealmList,其中E不扩展Realm对象,所以我将字符串包装在RealmObject中。 我的领域对象如下 SimpleRealmObj工作正常,因为它只有字符串元素 如何反序列化stringStuff?我试过使

  • 问题内容: 我需要转换从REST API获得的JSON数据,并将其转换为CSV以便进行分析。问题在于JSON数据不一定遵循相同的内容,因此我无法定义映射类型。这已经成为一项挑战,占用了我太多时间。我已经创建了一些代码,但是由于它在此行上引发了异常,因此它当然不起作用 错误是: 附加信息:无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型’System.Collecti

  • 问题内容: 我有一个具有以下结构的JSON有效负载… …映射到以下类: 目前,如果用户提交的浮点值,则将忽略小数,并且仅接受整数部分。我想要做的是防止用户提交带有浮动值的有效负载(请参见下文)并引发异常(类似于“第8列第5行的“年龄”字段的JSON值无效”),这是标准做法反序列化失败时出现错误消息)。 我正在考虑为数字值实现自定义反序列化器,但想知道是否有更简单的方法来实现此目的。 问题答案: 在

  • 问题内容: 使用Gson的方法时,可以使用某种给定类的set 方法吗? 我想这样做是因为对于目标类的每个全局变量都会进行修剪。 为此有任何GSON API注释吗? 我知道GSON提供了编写自定义序列化器/反序列化器的功能,但我想知道是否还有另一种方法可以实现此目的。 问题答案: 我实施了并在上注册了。因此,对于收到的所有String字段,Gson将使用my 反序列化该值。 下面是我的代码: …以及