我在Android应用程序中实现Json反序列化时遇到了一些问题(带有Gson库)
public class MyJson<T>{
public List<T> posts;
}
public class JsonDownloader<T> extends AsyncTask<Void, Void, MyJson<T>> {
...
protected MyJson<T> doInBackground(Void... params) {
...
Reader reader = new InputStreamReader(content);
GsonBuilder gson = new GsonBuilder();
Type collectionType = new TypeToken<MyJson<T>>() {}.getType();
result = gson.create().fromJson(reader, collectionType);
...
}
}
必须在反序列化时指定T
的类型。如果gson
不知道要实例化什么类型
,那么如何创建文章
列表?它不可能永远停留在T
。因此,您可以提供t
类型作为class
参数。
现在,假设posts
的类型是string
,您可以将myjson
反序列化为(为了简单起见,我还添加了一个string json
参数;您可以像前面一样从阅读器
):
doInBackground(String.class, "{posts: [\"article 1\", \"article 2\"]}");
protected MyJson<T> doInBackground(Class<T> type, String json, Void... params) {
GsonBuilder gson = new GsonBuilder();
Type collectionType = new TypeToken<MyJson<T>>(){}.getType();
MyJson<T> myJson = gson.create().fromJson(json, collectionType);
System.out.println(myJson.getPosts()); // ["article 1", "article 2"]
return myJson;
}
类似地,反序列化boolean
对象的myjson
doInBackground(Boolean.class, "{posts: [true, false]}");
protected MyJson<T> doInBackground(Class<T> type, String json, Void... params) {
GsonBuilder gson = new GsonBuilder();
Type collectionType = new TypeToken<MyJson<T>>(){}.getType();
MyJson<T> myJson = gson.create().fromJson(json, collectionType);
System.out.println(myJson.getPosts()); // [true, false]
return myJson;
}
我假定myjson
为示例
public class MyJson<T> {
public List<T> posts;
public List<T> getPosts() {
return posts;
}
}
因此,如果您正在寻找反序列化列表
,您可以将该方法调用为
// assuming no Void parameters were required
MyJson<MyObject> myJson = doInBackground(MyObject.class);
问题内容: 我正在使用GSON 1.4,并使用两个通用对象序列化对象,如下所示 。当我对它进行反序列化时 可悲的是我得到了 java.lang.IllegalArgumentException:无法将java.util.ArrayList字段…设置为java.util.LinkedList 这是为什么 ?GSON文档指出,如果我使用object.class参数进行序列化,则它支持泛型。任何想法?谢
我有一个Api,Api如下所示: 如果响应是ok,那么结构将以关键字开头,例如: 问题是:我如何为父类创建一个反序列化器,它也会反序列化子类(作为我的第二种方法),或者我如何用Gson创建一个泛型类,这样包装在周围的每个tyoe都可以与它一起使用,比如: public class DataObjectDeserializer implements JsonDeserializer{
您将获得对象(或对象列表),而不是作为传递的实际对象(或第二种情况下的实际对象列表)。 如果您想要一个仍然想要反序列化泛型类型对象(-s),请参阅下面的答案。 +红利:LoopJ+GSON的最终通用解决方案 如何获取泛型接口的具体类型 Java类型Generic作为GSON的参数
我想通过Google Gson传输一个列表对象,但我不知道如何反序列化泛型类型。 我在看了这个之后尝试了什么(Balusc的回答): 编辑: 现在我有 但是,我确实在“FromJson”行得到以下异常: null
问题内容: 我在Android应用程序(带有Gson库)中实现Json反序列化存在一些问题 我已经上了这样的课 反序列化的调用是: 问题是调用后的result.posts列表包含一个LinkedTreeMap对象数组(具有正确的值,因此问题是反序列化)而不是MyJson对象。当我使用MyObject而不是T时,一切运行正常并且MyObject是正确的。 那么,有什么方法可以在不创建自定义反序列化器