最近遇到一个错误,就是某个字段肯定是long类型的,通过map<str360背景ing,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, "张三"); asrt.asrtequals(idvalue, (long) data.get(id)); string jsonstring = json.tojsonstring(data); // 反序列化时long被转为了integer map map = json.parobject(jsonstring, map.class); object idobj = mapand的用法.get(id); asrt.asrttrue(idobj instanceof integer); asrt.asrtequals(idvalue, (long) idobj); }
没用通过json序列化,虽然类型为object,但是实际的类型为long。
序列化为json时后,josn串是没有 long类型的,而且反转回来也是object接收,如果数字小于interger的最大值,给转成了integer!
参见我的 另外一篇文章 json 反序列化 long 变 integer 或 double 问题
总之开发中尽量不要乱用一些对象属性转换工具,导致属性漏掉或姚电电者转错。
不要滥用map或者jsonobject来传递参数。
如果是含object类型json序列化要特别小心上述问题!!
现象:通过查库(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。
使用情景:后端返回的json字符串,通过gson处理后,原本是int类型,现在获取到的是double类型的。
政治纲领
解决:
int i = ((number)fromjson.get("int")).intvalue();int i = math.round(double.pardouble(fromjson.get("int").tostring));
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 14:23:24,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/62df76bbe4bfc47131d16885d5d479bc.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:JSON序列化导致Long类型被搞成Integer的坑及解决.doc
本文 PDF 下载地址:JSON序列化导致Long类型被搞成Integer的坑及解决.pdf
留言与评论(共有 0 条评论) |