使用GSON反序列化通用类型

VizGhar:

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

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

拉维(Ravi Thapliyal):

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

现在假设,类型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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用GSON反序列化未知的原始JSON属性类型

使用GSON OffsetDateTime反序列化

如何使用Gson序列化和反序列化Java 8的java.time类型?

具有通用类型和通用字段名称的GSON反序列化

Google Gson-反序列化list <class>对象?(通用类型)

使用GSON反序列化嵌套的通用类时的奇怪行为

使用GSON反序列化泛型类型时遇到麻烦

使用gson反序列化对象的特定JSON字段

如何使用Google GSON将JSON数组反序列化为通用类型的Collection?

使用Gson反序列化ImmutableList

使用google-gson进行JSON序列化/反序列化通用类型

使用TypeReference的具有通用类型的JSON反序列化器

如何使用Gson反序列化继承通用基类的类型?

无法使用Gson库对Firestore DocumentReference数据类型进行序列化/反序列化

Gson反序列化通用类型适配器的基类

使用包含变量类型字段的Gson反序列化JSON响应

如何在通用类型的gson上使用自定义反序列化?

如何使用Moshi反序列化通用类型?

Json反序列化未知或通用模型类型

GSON的GSON亚型反序列化

使用Gson反序列化JSON

GSON反序列化

GSON在Android中使用两种不同类型的对象反序列化列表

JSON反序列化器继承的通用类型

不断变化的字段类型的Gson反序列化

使用 Gson 反序列化具有多种类型的列表列表

使用 Gson 使用参数化成员字段反序列化参数化类型

API 类型的通用 Gson 序列化

使用 gson 反序列化反序列化對象的內部對象