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

转载自:
http://www.codeweblog.com/java%E5%BA%8F%E5%88%97%E5%8C%96json%E6%97%B6long%E5%9E%8B%E6%95%B0%E5%80%BC%E4%B8%8D%E5%87%86%E7%A1%AE/

现象
项目中用到了唯一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时的解决方案.

项目使用SpringBoot快速构建的,这里使用了拦截器.

package com.dachen.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import java.util.List;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by test on 2017/7/18.
 */
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {
    @Override
    public void configureMessageConverters(List> 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);
    }

}

你可能感兴趣的:(JavaWeb)