JSON序列化导致Long类型被搞成Integer的坑及解决
json序列化导致long类型被搞成integer的坑
最近遇到一个错误,就是某个字段肯定是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 问题
思考
总之开发中尽量不要乱用一些对象属性转换工具,导致属性漏掉或者转错。
不要滥用map或者jsonobject来传递参数。
如果是含object类型json序列化要特别小心上述问题!!
json格式转int/long报错
现象:通过查库(mysql)获取信息,其中有个字段a的值为int类型的5,然后在前端页面,把数据(json)通过ajax请求到后台(在前端页面a的类型为number),在后台用map<string, object>接收json数据,此时a的值变为5.0了,从整型变为了浮点型。此时转换成int会出现类型转换异常。
问题:从前端页面传递过来的json串,后台能map接收,再利用map的get()方法获取相应的属性值,这时当属性类型为int或者long类型时会出现转换异常。
解决方法,先将相应的属性转换成number类型,再调用number对应的方法进行转换。但有个地方需要注意,需要先判断该属性是否为空再进行转换,否则会出现nullpointerexception。
gson转换导致int转换成double的问题
使用情景:后端返回的json字符串,通过gson处理后,原本是int类型,现在获取到的是double类型的。
解决:
int i = ((number)fromjson.get("int")).intvalue(); int i = math.round(double.parsedouble(fromjson.get("int").tostring));
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。