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

 更新时间:2022年01月13日 16:24:43   作者:明明如月学长  
这篇文章主要介绍了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));

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

相关文章

  • 详解Spring学习之声明式事务管理

    详解Spring学习之声明式事务管理

    这篇文章主要介绍了详解Spring学习之声明式事务管理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java树形菜单的创建

    Java树形菜单的创建

    这篇文章主要为大家详细介绍了Java图形用户界面中树形菜单的创建树形菜单的创建,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-10-10
  • Mybatis-Plus字段策略FieldStrategy的使用

    Mybatis-Plus字段策略FieldStrategy的使用

    本文主要介绍了Mybatis-Plus字段策略FieldStrategy的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 详解关于IntelliJ IDEA中Schedule for Addition 的问题

    详解关于IntelliJ IDEA中Schedule for Addition 的问题

    本篇文章主要介绍了详解关于 IntelliJ IDEA 中 Schedule for Addition 的问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • java socket实现局域网聊天

    java socket实现局域网聊天

    这篇文章主要为大家详细介绍了java socket实现局域网聊天,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Java的异常处理体系详解

    Java的异常处理体系详解

    这篇文章主要介绍了Java的异常处理体系,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • IntelliJ IDEA 2020.3 重大特性(新功能一览)

    IntelliJ IDEA 2020.3 重大特性(新功能一览)

    这篇文章主要介绍了IntelliJ IDEA 2020.3 重大特性(新功能一览),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Spring配置与依赖注入基础详解

    Spring配置与依赖注入基础详解

    依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例
    2022-08-08
  • 使用feign服务调用添加Header参数

    使用feign服务调用添加Header参数

    这篇文章主要介绍了使用feign服务调用添加Header参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 程序猿必须要掌握的多线程安全问题之锁策略详解

    程序猿必须要掌握的多线程安全问题之锁策略详解

    在笔者面试过程时,经常会被问到各种各样的锁,如乐观锁、读写锁等等,非常繁多,在此做一个总结,介绍的内容如下,需要的朋友可以参考下
    2021-06-06

最新评论