gpt4 book ai didi

java - 使用 GSON 反序列化泛型类型

转载 作者:IT老高 更新时间:2023-10-28 12:46:28 29 4
gpt4 key购买 nike

在我的 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 的类型在反序列化的时候。你的Listposts如果 Gson 则创建不知道是什么Type实例化?留不住T永远。因此,您将提供类型 T作为 Class参数。

现在假设 posts 的类型是 String你会反序列化 MyJson<String> as(为简单起见,我还添加了 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;
}
}

所以,如果您要反序列化 List<MyObject>你会调用该方法

// assuming no Void parameters were required
MyJson<MyObject> myJson = doInBackground(MyObject.class);

关于java - 使用 GSON 反序列化泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18397342/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com