【问题标题】:De-serializing nested, generic class with gson使用 gson 反序列化嵌套的泛型类
【发布时间】:2013-01-23 14:23:55
【问题描述】:

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

包装器对象,简化,但通常包含其他属性,例如 statusMessage,这些属性与服务器的 data 字段一起返回:

public class Response<T> {

   private List<T> data = null;

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

}

简单类,来自上述data-field 的预期输出(虽然是一个数组):

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

任何帮助将不胜感激。

【问题讨论】:

    标签: java oop generics deserialization gson


    【解决方案1】:

    您实际遇到的问题不是直接由于Gson,而是因为数组和泛型如何协同工作。

    您会发现在像您这样的课程中实际上无法做到new T[10]。见:How to create a generic array in Java?

    你基本上有两种选择:

    1. 编写自定义反序列化程序并在那里构造 T[] 数组,如我上面链接的 SO 问题所示
    2. 改用List&lt;T&gt;,这样它就可以正常工作了。如果你真的需要返回一个数组,你可以随时在你的方法中调用List.toArray()

    由以下 cmets 编辑:

    这是一个完整的示例:

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

    输出:

    成为

    【讨论】:

    • 不知道问题出在泛型数组部分。不过,我对 Java 和泛型都很陌生。无论如何,你的答案正是我想要的——我选择了List&lt;T&gt; 解决方案。非常感谢;你让我一整个晚上感觉很好! :-)
    • 嗯,经过进一步测试,它并没有我希望的那么好。执行 Language l = languages.get(0); /* from map */ 然后 println(l.alias) 会产生此异常: pastebin.com/Wctziipr 。任何想法或建议将不胜感激!
    • 你能用你更新的类和代码编辑你的问题吗?我没有测试它,但它确实应该可以工作。
    • 呵呵,如果我每次说这话都能得到一分钱。问题已更新。
    • 查看编辑 - 您使用的是什么版本的 Gson?这是用 2.2.2 测试的
    猜你喜欢
    • 2013-08-26
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多