我正在尝试使用 Gson 反序列化一个嵌套的泛型类。类结构如下所示:
Wrapper 对象,经过简化,但通常包含其他属性,例如 statusMessage
,它们与服务器的 data
字段一起返回:
public class Response<T> {
private List<T> data = null;
public List<T> getData() { return this.data; }
}
简单类,上面data
字段的预期输出(虽然是一个数组):
public class Language {
public String alias;
public String label;
}
用法:
Type type = new TypeToken<Response<Language>>() {}.getType();
Response<Language> response = new Gson().fromJson(json, type);
List<Language> languages = response.getData();
Language l = languages.get(0);
System.out.println(l.alias); // Error occurs here
json
变量是 something like this .
但是,执行此操作时,我收到以下异常(在第 3 行,最后一个代码示例):
ClassCastException: com.google.gson.internal.StringMap cannot be cast to book.Language
仅当将 getData()
中的数据存储到变量(或用作一个变量)时才会发生异常。
如有任何帮助,我们将不胜感激。
最佳答案
您实际遇到的问题并非直接由 Gson
引起,这是因为数组和泛型如何一起发挥作用。
你会发现你实际上做不到 new T[10]
在像你这样的类(class)。参见:How to create a generic array in Java?
你基本上有两个选择:
- 编写自定义反序列化器并构建
T[]
如我在上面链接的 SO 问题中所示的数组 - 使用
List<T>
相反,它就会简单地工作。如果你真的需要返回一个数组,你总是可以调用List.toArray()
用你的方法。
根据以下评论编辑:
这是一个完整的示例:
public class App
{
public static void main( String[] args )
{
String json = "{\"data\": [{\"alias\": \"be\",\"label\": \"vitryska\"},{\"alias\": \"vi\",\"label\": \"vietnamesiska\"},{\"alias\": \"hu\",\"label\": \"ungerska\"},{\"alias\": \"uk\",\"label\": \"ukrainska\"}]}";
Type type = new TypeToken<Response<Language>>(){}.getType();
Response<Language> resp = new Gson().fromJson(json, type);
Language l = resp.getData().get(0);
System.out.println(l.alias);
}
}
class Response<T> {
private List<T> data = null;
public List<T> getData() { return this.data; }
}
class Language {
public String alias;
public String label;
}
输出:
be
关于java - 使用 gson 反序列化嵌套的泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14481982/