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

时间:2013-01-23 14:23:55

标签: java oop generics deserialization gson

使用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()中的数据存储到变量(或用作一个)时,只会发生异常。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:8)

你实际遇到的问题并非直接归因于Gson,而是因为数组和泛型如何一起发挥作用。

你会发现在像你这样的课程中你实际上不能new T[10]。见:How to create a generic array in Java?

您基本上有两个选择:

  1. 编写一个自定义反序列化器并在那里构建T[]数组,如上面链接的SO问题所示
  2. 使用List<T>代替,然后它就可以了。如果确实需要返回一个数组,您可以随时在方法中调用List.toArray()
  3. 根据以下评论进行编辑:

    这是一个完全有效的例子:

    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;
    }
    

    输出: