6

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

Wrapper 对象,已简化,但通常包含其他属性,例如,它们与服务器的 -fieldstatusMessage一起返回:data

public class Response<T> {

   private List<T> data = null;

   public List<T> getData() { return this.data; }   

}

简单的类,上面 -field 的预期输出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-variable 是这样的。

但是,执行此操作时,我收到以下异常(在第 3 行,最后一个代码示例):

ClassCastException:com.google.gson.internal.StringMap 无法转换为 book.Language

仅当将数据存储getData()到变量中(或用作变量时)时才会发生异常。

任何帮助将不胜感激。

4

1 回答 1

8

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

你会发现在你这样new T[10]的课堂上你实际上做不到。请参阅:如何在 Java 中创建泛型数组?

你基本上有两个选择:

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

输出:

于 2013-01-23T21:32:19.097 回答