使用gson反序列化嵌套的泛型类

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()到变量中(或作为一个变量使用时)才会发生异常.

任何帮助将受到高度赞赏.

Bri*_*ach 8

你实际遇到的问题不是直接导致的Gson,而是因为数组和泛型如何一起发挥作用.

你会发现你实际上不能new T[10]像你这样的课程.请参阅:如何在Java中创建通用数组?

你基本上有两个选择:

  1. 编写一个自定义反序列化器并在T[]那里构造数组,如上面链接的SO问题所示
  2. 使用一个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)

输出: