Skip to content

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());
}