fastjson 反序列化泛型时发生 java.lang.ClassCastException 异常
🏷️ 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 中的这个例子看起来更直观一些。
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 中也给出了解决方案,使用 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());
}