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

使用Gson,我试图反序列化一个嵌套的泛型类.类结构如下所示:

包装器对象,简化,但通常包含其他属性,如statusMessage,它们与服务器的数据字段一起返回:

public class Response<T> {

   private List<T> data = null;

   public List<T> getData() { return this.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,而是因为数组和泛型如何一起发挥作用.

你会发现你实际上不能在像你这样的课堂上做新的T [10].见:How to create a generic array in Java?

你基本上有两个选择:

>编写一个自定义反序列化器并在那里构造T []数组,如上面链接的SO问题所示
>使用列表< 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反序列化嵌套的泛型类 - 代码日志