Java序列化Long类型数据到前端数据失真
现象
项目中用到了唯一ID生成器.生成出的ID是long型的(比如说4616189619433466044).
通过某个rest接口中返回json数据后,发现浏览器解析完变成了4616189619433466000.
原因
大致描述:java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值).
解决方法
方法就是不用number来保存long值,而是使用string.可以在客户端js修改,
也可以在服务端序列化的时候修改.
方案1:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
//序列化成String的传@JsonSerialize(using = ToStringSerializer.class)private Long id;
方案1:
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {@Overridepublic 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);}}