Java Gson不兼容的类型

时间:2016-03-14 13:58:53

标签: java android json hashmap gson

我使用Gson编码和解码POJO到JSON,但是,Gson有一些意想不到的行为。

事实上,我有一个看起来像这样的对象

public class MyClass{
    public int id;
    public Object someData;
}

它是iddata的构造函数。

我经常将HashMap<Integer, Integer>传递给Object,Gson正在解析它非常完美。问题是解码,它将其解码为Integer,Double的散列图,即使我像这样调用函数:

private HashMap<Integer, Integer> hashMapTemplate = new HashMap<>();
HashMap<Integer, Integer> myData = gson.fromJson(data, hashMapTemplate.getClass());
然后我操纵myData,抛出一个

  

ClassCastException:java.lang.Double无法强制转换为   java.lang.Integer中。

如果我添加一个明确的演员(int),它会抛出一个

  

ClassCastException:java.lang.String无法强制转换为   java.lang.Integer中。

我不明白的是,定义为保存两个整数的HashMap如何能够保存Double或String ...

有没有人有解决方案? 谢谢!

1 个答案:

答案 0 :(得分:3)

由于类型擦除,HashMap的类对象无论是HashMap<String, Integer>还是HashMap<Foo, Bar>都是相同的。实际上,您当前的代码也可能已经HashMap.class传递给fromJson并完全跳过了模板对象。

要保留通用类型,您需要TypeToken

HashMap<Integer, Integer> h = gson.fromJson(json, new TypeToken<HashMap<Integer, Integer>>() {});

TypeToken使用Class.getGenericSuperclass()的巧妙技巧,因此必须始终将其创建为子类,因此内联匿名子类化语法。