Zar*_*Zar 5 java oop generics gson deserialization
使用Gson,我试图反序列化一个嵌套的泛型类.类结构如下所示:
包装器对象,简化,但通常包含其他属性,例如statusMessage,与data服务器的-field 一起返回:
public class Response<T> {
private List<T> data = null;
public List<T> getData() { return this.data; }
}
Run Code Online (Sandbox Code Playgroud)
简单类,data上面的字段的预期输出(尽管作为数组):
public class Language {
public String alias;
public String label;
}
Run Code Online (Sandbox Code Playgroud)
用法:
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
Run Code Online (Sandbox Code Playgroud)
凡json-variable是这样的.
但是,在执行此操作时,我收到以下异常(在第3行,最后一个代码示例):
ClassCastException:com.google.gson.internal.StringMap无法强制转换为book.Language
仅在将数据存储getData()到变量中(或作为一个变量使用时)才会发生异常.
任何帮助将受到高度赞赏.
你实际遇到的问题不是直接导致的Gson,而是因为数组和泛型如何一起发挥作用.
你会发现你实际上不能new T[10]像你这样的课程.请参阅:如何在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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
是
| 归档时间: |
|
| 查看次数: |
1717 次 |
| 最近记录: |