• springmvc返回接口中long型,页面接收时值却变了


    Java序列化JSON时long型数值不准确 现象

    项目中用到了唯一ID生成器.生成出的ID时long型的(比如说4616189619433466044).
    通过某个rest接口中返回json数据后,发现浏览器解析完变成了4616189619433466000

    原因

    大致描述:java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值).
    详情参考这里http://stackoverflow.com/questions/17320706/javascript-long-integer

    rest接口返回的json字符串中,数值还是对的.当js对json进行解析并转成js object的时候,出现了问题.

    解决方法

    方法就是不用number来保存long值,而是使用string.可以在客户端js修改,也可以在服务端序列化的时候修改.
    此处给出sprign mvc 使用 jackson时的解决方案.

    [@Override](https://my.oschina.net/u/1162528)
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
    
        ObjectMapper objectMapper = new ObjectMapper();
        /**
         * 序列换成json时,将所有的long变成string
         * 因为js中得数字类型不能包含所有的java long值
         */
        SimpleModule simpleModule = new SimpleModule();
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
    
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
        converters.add(jackson2HttpMessageConverter);
    }
  • 相关阅读:
    Do you want a timeout?
    [整]常用的几种VS编程插件
    [转]Windows的窗口刷新机制
    [整][转]Invoke和BeginInvoke的使用
    [整]C#获得程序路径
    [转]Visual Studio 2010 单元测试目录
    飞秋的实现原理
    面向对象的七大原则
    [转]玩转Google开源C++单元测试框架Google Test系列
    [转]C#中的Monitor类
  • 原文地址:https://www.cnblogs.com/lendar/p/10509110.html
Copyright © 2020-2023  润新知