我正在使用 Gson 将 POJO 编码和解码为 JSON,但是,Gson 有一些意外行为。
事实上,我有一个看起来像这样的对象
public class MyClass{
public int id;
public Object someData;
}
它的构造函数是 id
和 data
.
我经常传递一个HashMap<Integer, Integer>
到 Object,Gson 非常完美地解析了它。问题是解码,它将它解码为 Integer,Double
的 HashMap 即使我这样调用函数:
private HashMap<Integer, Integer> hashMapTemplate = new HashMap<>();
HashMap<Integer, Integer> myData = gson.fromJson(data, hashMapTemplate.getClass());
然后我操作 myData,它抛出一个
ClassCastException: java.lang.Double cannot be cast to java.lang.Integer.
如果我添加显式转换 (int)
它抛出一个
ClassCastException: java.lang.String cannot be cast to java.lang.Integer.
我不明白的是,定义为保存两个整数的 HashMap 如何保存 Double 或 String...
有人有解决办法吗? 谢谢!
最佳答案
由于类型删除,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()
,因此必须始终将其创建为子类,因此使用内联匿名子类语法。
关于Java Gson 不兼容的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35989542/