小编典典

使用GSON反序列化通用类型

json

我在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是正确的。

那么,有什么方法可以在不创建自定义反序列化器的情况下实现反序列化调用?


阅读 252

收藏
2020-07-27

共1个答案

小编典典

您必须T在反序列化时指定的类型。如果不知道要实例化什么,将如何创建您List的?它不会永远存在。因此,您将提供类型作为参数。posts``Gson``Type``T``T``Class

现在假设,类型postsString你会反序列化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;
}

同样,反序列MyJsonBoolean对象

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);
2020-07-27