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

标签 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 cannot be cast to book.Language

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

如有任何帮助,我们将不胜感激。

最佳答案

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

你会发现你实际上做不到 new T[10]在像你这样的类(class)。参见:How to create a generic array in 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;
}

输出:

be

关于java - 使用 gson 反序列化嵌套的泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14481982/

相关文章:

java - 由于转换问题,尝试获取 EditText 时出现问题

java - 无法让 Canvas/CanvasLayer 在 Playn 中工作

java - Mac 上的 IntelliJ 表示该文件应命名为 Scratch.java 但它已经命名为 Scratch.java

没有为每个对象重新创建的 Javascript "priveleged"方法?

MatLab OOP 不改变属性

ios - 如何声明具有符合协议(protocol)的具体返回类型的函数?

java - 访问参数化类型的参数化类型

java - NumberFormatException - Azure Blob 列表

C# 银行示例 - 客户类 - 取款、存款等

java - 通配符类型不匹配与原始类型