一、背景
最近遇到一个错误,就是某个字段肯定是Long类型的,通过Map<String,Object>方式转成JSON字符串,然后存到了DB的某个字段里。
为了Json存储字,然后反序列化为Map(不是自定义的常规对象)
比如某二方为了提供通用的接口能力,将Map<String,Object>的数据通过JSON序列化方式缓存然后JSON反序列化拿到Map。
等情况。
用的时候就通过Key获取对象之后直接强转Long,然后类型转换异常。
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
二、上代码
@Test(expected = ClassCastException.class)
public void testJson() {
String id = "id";
String name = "name";
Long idValue = 3000L;
Map<String, Object> data = new HashMap<>(2);
data.put(id, idValue);
data.put(name, "张三");
Assert.assertEquals(idValue, (Long) data.get(id));
String jsonString = JSON.toJSONString(data);
// 反序列化时Long被转为了Integer
Map map = JSON.parseObject(jsonString, Map.class);
Object idObj = map.get(id);
Assert.assertTrue(idObj instanceof Integer);
Assert.assertEquals(idValue, (Long) idObj);
}
没用通过JSON序列化,虽然类型为Object,但是实际的类型为Long。
序列化为Json时后,Josn串是没有 Long类型的,而且反转回来也是Object接收,如果数字小于Interger的最大值,给转成了Integer!
三、方案
参见我的 另外一篇文章 JSON 反序列化 Long 变 Integer 或 Double 问题_明明如月的技术博客-CSDN博客
四、思考
总之开发中尽量不要乱用一些对象属性转换工具,导致属性漏掉或者转错。
不要滥用Map或者JSONObject来传递参数。
如果是含Object类型JSON序列化要特别小心上述问题!!
如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。
另外欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。
https://t.zsxq.com/Z3bAiea 申请时标注来自CSDN。‘