Java Gson 不兼容的类型

标签 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 的 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.classfromJson并完全跳过模板对象。

要保留通用类型,您需要一个 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/

相关文章:

android - 有没有手机游戏的安全交易插件?

javascript - SimpleHTTPServer 代码 404,消息未找到文件

java - Struts 2 动态变量

java - Spring Framework名称背景

java - 在java中播放音频文件

java - LinkedIn - 如何传递查询参数

android - 水平菜单浏览器兼容性

android - 如何将 TextView 的字体更改为无衬线或等宽字体?

javascript - 从嵌套的 json 对象中获取最小值

java - 在Java中解析JSON数组