我想通过Google Gson传输列表对象,但是我不知道如何反序列化泛型类型。
看了这个之后我尝试了什么(BalusC的答案):
MyClass mc = new Gson().fromJson(result, new List<MyClass>(){}.getClass());
但是后来我在日食中遇到了一个错误,说“新的List(){}类型必须实现继承的抽象方法…”,如果我使用快速修复方法,则会得到20个以上的方法存根的怪兽。
我很确定有一个更简单的解决方案,但是我似乎找不到它!
编辑:
我现在有
Type listType = new TypeToken<List<MyClass>>()
{
}.getType();
MyClass mc = new Gson().fromJson(result, listType);
但是,在“ fromJson”行中确实得到以下异常:
java.lang.NullPointerException
at org.apache.harmony.luni.lang.reflect.ListOfTypes.length(ListOfTypes.java:47)
at org.apache.harmony.luni.lang.reflect.ImplForType.toString(ImplForType.java:83)
at java.lang.StringBuilder.append(StringBuilder.java:203)
at com.google.gson.JsonDeserializerExceptionWrapper.deserialize(JsonDeserializerExceptionWrapper.java:56)
at com.google.gson.JsonDeserializationVisitor.invokeCustomDeserializer(JsonDeserializationVisitor.java:88)
at com.google.gson.JsonDeserializationVisitor.visitUsingCustomHandler(JsonDeserializationVisitor.java:76)
at com.google.gson.ObjectNavigator.accept(ObjectNavigator.java:106)
at com.google.gson.JsonDeserializationContextDefault.fromJsonArray(JsonDeserializationContextDefault.java:64)
at com.google.gson.JsonDeserializationContextDefault.deserialize(JsonDeserializationContextDefault.java:49)
at com.google.gson.Gson.fromJson(Gson.java:568)
at com.google.gson.Gson.fromJson(Gson.java:515)
at com.google.gson.Gson.fromJson(Gson.java:484)
at com.google.gson.Gson.fromJson(Gson.java:434)
我 确实 捕获到JsonParseExceptions,并且“结果”不为null。
我用调试器检查了listType并得到了以下内容:
因此似乎“ getClass”调用无法正常工作。有什么建议…?
Edit2:我检查了Gson用户指南。它提到了在将通用类型解析为Json期间应该发生的运行时异常。就像在示例中一样,我做到了“错误”(上面未显示),但根本没有得到该异常。因此,我按照用户指南中的建议更改了序列化。但是没有帮助。
Edit3:解决了,请参阅下面的答案。
反序列化通用集合的方法:
import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;
...
Type listType = new TypeToken<ArrayList<YourClass>>(){}.getType();
List<YourClass> yourClassList = new Gson().fromJson(jsonArray, listType);
由于评论中的几个人都提到了它,因此这里是有关如何使用TypeToken
该类的说明。该构造new TypeToken<...>() {}.getType()
将编译时类型(在<
和之间>
)捕获到运行时java.lang.reflect.Type
对象中。与Class
只能表示原始(擦除)类型的Type
对象不同,该对象可以表示Java语言中的任何类型,包括通用类型的参数化实例化。
在TypeToken
类本身不具有公共构造,因为你不应该直接构造它。相反,您总是构造一个匿名子类(因此{}
,,这是该表达式的必要部分)。
由于类型擦除,TypeToken
该类只能捕获在编译时完全已知的类型。(也就是说,您不能new TypeToken<List<T>>() {}.getType()
对类型参数进行操作T
。)
有关更多信息,请参见类的文档TypeToken
。
问题内容: 在Apache Jackson和Jackson一起使用Apache Jersey进行JSON序列化时(在服务器和客户端上),在反序列化通用List时遇到问题。 我正在生成的JSON如下,“数据”中的所有3个类都实现“ CheckStatusDetail”: 产生此JSON的对象如下所示,我在客户端使用相同的类: 自从我将此注释添加到我的CheckStatusDetail接口后,就应用了
问题内容: 我想编写一个通用函数,使用Gson反序列化通用类型List,下面是代码: 但是这段代码不起作用,我得到一个奇怪的结构,但是没有我的类型列表 当我使用时: 我工作,我得到了! 但是我需要一个通用函数,我该如何解决? 问候rubiktubik 问题答案: 没有将(as )的实际类型传递给您的方法,就无法做到这一点。 但是,如果显式传递它,则可以按如下所示创建for : 也可以看看:
我正在尝试为泛型列表创建一个自定义反序列化器。假设我得到了类B的json表示: 其中A是我仅在运行时看到的其他类。我想创建一个反序列化程序,该程序能够将listObject的类型推断为具有内部类型a的list,并将其反序列化,而不是使用默认的hashmap反序列化程序。 我尝试使用上下文反序列化器,类似于这里建议的,然后将其添加为List的自定义反序列化器 但是我不确定我应该如何读取json并在反
问题内容: 我在Android应用程序(带有Gson库)中实现Json反序列化存在一些问题 我已经上了这样的课 反序列化的调用是: 问题是调用后的result.posts列表包含一个LinkedTreeMap对象数组(具有正确的值,因此问题是反序列化)而不是MyJson对象。当我使用MyObject而不是T时,一切运行正常并且MyObject是正确的。 那么,有什么方法可以在不创建自定义反序列化器
我认为最好用一个例子来解释。 我有一个想要反序列化的JSON对象,它包含一个接口类型列表以及列表中的类型,但是我不确定如何让反序列化器确定列表中的具体类型: 要反序列化的类型 界面 儿童 我知道如果类型不是<code>List</code>,我可以将类型与<code>JsonSubTypes</code>一起使用,例如: 如果在父类型内,也是如此。但是当类型在类之外时,是否有一种方法可以帮助反序列
我想将json反序列化到类Foo: IBar有两个实现,但是当反序列化时,我总是想使用第一个实现。(理想情况下,这将使问题变得更容易,因为不需要运行时类型检查) 我相信我可以编写自定义反序列化程序,但我觉得一定有更简单的方法。 我找到了这个注释,它在没有列表的情况下非常有效。