我在Android应用程序(带有Gson库)中实现Json反序列化存在一些问题
我已经上了这样的课
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);
...
}
}
问题是调用后的result.posts列表包含一个LinkedTreeMap对象数组(具有正确的值,因此问题是反序列化)而不是MyJson对象。当我使用MyObject而不是T时,一切运行正常并且MyObject是正确的。
那么,有什么方法可以在不创建自定义反序列化器的情况下实现反序列化调用?
您必须T
在反序列化时指定的类型。如果不知道要实例化什么,如何创建您List
的?它不会永远存在。因此,您将提供类型作为参数。posts
Gson
Type
T
T
Class
现在假设,类型posts
是String
你会反序列化MyJson<String>
的(我还添加了一个String json
用于简单的参数,你会从你读reader
如前):
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;
}
同样,反序列MyJson
化Boolean
对象
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<T>
我的例子是
public class MyJson<T> {
public List<T> posts;
public List<T> getPosts() {
return posts;
}
}
因此,如果您要反序列化a List<MyObject>
,则可以将该方法调用为
// assuming no Void parameters were required
MyJson<MyObject> myJson = doInBackground(MyObject.class);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句