我使用Gson编码和解码POJO到JSON,但是,Gson有一些意想不到的行为。
事实上,我有一个看起来像这样的对象
public class MyClass{
public int id;
public Object someData;
}
它是id
和data
的构造函数。
我经常将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 ...
有没有人有解决方案? 谢谢!
答案 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()
的巧妙技巧,因此必须始终将其创建为子类,因此内联匿名子类化语法。