欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JSON序列化导致Long类型被搞成Integer的坑及解决

程序员文章站 2022-06-10 10:35:45
目录json序列化导致long类型被搞成integer的坑上代码方案思考json格式转int/long报错gson转换导致int转换成double的问题json序列化导致long类型被搞成intege...

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。

JSON序列化导致Long类型被搞成Integer的坑及解决

gson转换导致int转换成double的问题

使用情景:后端返回的json字符串,通过gson处理后,原本是int类型,现在获取到的是double类型的。

JSON序列化导致Long类型被搞成Integer的坑及解决

解决:

int i = ((number)fromjson.get("int")).intvalue();
int i = math.round(double.parsedouble(fromjson.get("int").tostring));

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。