JSON.parseObject(jsonObj,Map.class)类型转换异常

温馨提示:本博客已经发布小程序,可在微信小程序中搜索”百变码农”,手机上也能看!

异常:

2019-05-31 16:12:26.692 [http-nio-1601-exec-2] ERROR at com.wb.test.controller.UserController

java.lang.Integer cannot be cast to java.lang.Long
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

出现该异常的代码:

String jsonStr = “{\”123001\”:1201,\”109131\”:1301}”;
Map<String,Long> map = JSONObject.parseObject(jsonStr, Map.class);
Long uid = map.get(“123001”);
System.out.println(uid);

出现原因:由于使用了JSONObject.parseObject(str,Map.class);将json字符串转为了Map类型而未指定目标Map中的泛型,此时Map中的类型可以写任何类型,编译的时候都不会被编译器识别出来。导致转换之后的Map类中并没有确定的泛型规定,所以在运行过程中使用map.get()方法获取到的value如果在int范围内,会自动当做Integer类型处理,如果用Long类型去接收,相当于将Integer转为Long,而由低精度向高精度强转就会抛出类型转换异常。

如果value是long类型范围内的数字,上述方法不会直接抛出异常,但是存在着安全隐患,可能会出现类型转换异常。

解决方法:

方法1:在使用JSONObject.parseObject()转换的时候,指定目标Map中的泛型,如下:

Map<String,Long> map = JSONObject.parseObject(jsonStr, new TypeReference<Map<String,Long>>(){});

方法2:先将获取到的数字类型的value转换为Number类型,然后转为Long类型,因为Number为Integer和Long的父类,可以直接转换,如下:

String jsonStr = “{\”123001\”:1201,\”109131\”:1301}”;
Map<String,Long> map = JSONObject.parseObject(jsonStr, Map.class);

Long value = ((Number)map.get(“123001”)).longValue();

System.out.println(value);

注:文章属原创,如果转发,请标注出处【https://www.jinnianshizhunian.vip】。如果小程序端代码显示混乱,是因为移动端兼容性导致,可移步至PC端站点查看!

另外提供优秀的Java架构师,各类IT开发视频,书籍资料,免费下载地址:https://www.592xuexi.com