使用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无法转换为book.Language
将getData()
中的数据存储到变量(或用作一个)时,只会发生异常。
任何帮助都将受到高度赞赏。
答案 0 :(得分:8)
你实际遇到的问题并非直接归因于Gson
,而是因为数组和泛型如何一起发挥作用。
你会发现在像你这样的课程中你实际上不能new T[10]
。见: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;
}
输出:
是