<!-- # fastjson 反序列化泛型时发生 java.lang.ClassCastException 异常 --> <!-- class-cast-exception-when-deserialize-generic-paradigm-by-fastjson --> 使用 *fastjson* 将字符串反序列化为 `Map` 类型,遍历结果有时会发生 *java.lang.ClassCastException* 异常。 ```java Map<String, String> allRequestParam = JSONObject.parseObject(s, Map.class); for (Map.Entry entry : allRequestParam.entrySet()) { result.put((String) entry.getKey(), (String) entry.getValue()); } ``` 官方仓库 [Issues #436][1] 中的这个例子看起来更直观一些。 ```java json = "{9223372036854775807:2,2:4}"; Map<Long, Short> map4 = JSON.parseObject(json, Map.class); System.out.println(map4);// {9223372036854775807=2, 2=4} System.out.println(map4.get(9223372036854775807L));// 2 System.out.println(map4.get(2L));// null System.out.println(map4.get(2));// 4 map4.forEach((k, v) -> map4.get(k)); //java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short ``` 原因在于通过 `JSON.parseObject(json, Map.class)` 反序列化的结果的具体类型是由 *fastjson* 自动判定的,上面的例子中判定为 `Integer` 类型,而不是接受变量中指定的 `Short` 类型。 [Issues #436][1] 中也给出了解决方案,使用 `TypeReference` 来实现泛型的反序列化。 ```java Map<String, String> allRequestParam = JSONObject.parseObject(s, new TypeReference<Map<String, String>>() {}); for (Map.Entry entry : allRequestParam.entrySet()) { result.put((String) entry.getKey(), (String) entry.getValue()); } ``` [1]:https://github.com/alibaba/fastjson/issues/436 (json转为Map时 指定泛型无效以及带来的一些问题) Loading... 版权声明:本文为博主「佳佳」的原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://www.liujiajia.me/2020/9/19/class-cast-exception-when-deserialize-generic-paradigm-by-fastjson ← 上一篇 下一篇 → 提交