Long型数据转换成json格式时丢失精度
爱新觉罗1 人气:0解决Long型数据转换成json格式时丢失精度
最近项目中突然发现雪花算法生成的数据库主键id返回给前端时和本身的值不一致,于是后端进行断点调试发现没问题,于是问题聚焦于转换json格式,于是自定义Json 格式化,因为使用Springboot,全是自动化配置,所以要覆盖框架本身的转换方式,经翻阅官方文档,提下下列注解,自定json转换
代码如下:
@JsonComponent public class JsonSerializerManage { @Bean public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); //忽略value为null 时 key的输出 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); /** * 序列换成json时,将所有的long变成string * 因为js中得数字类型不能包含所有的java long值 */ SimpleModule module = new SimpleModule(); module.addSerializer(Long.class, ToStringSerializer.instance); module.addSerializer(Long.TYPE, ToStringSerializer.instance); objectMapper.registerModule(module); return objectMapper; } }
SpringBoot时间格式,Long型精度丢失常见问题
时间格式,Long型精度丢失
方法一: 在配置文件application.yml中增加如下代码即可。
注意:WebMvcConfig配置类或启动类中不要加@EnableMVC注解,加了会导致jackson配置失效
spring: jackson: ## 日期格式(可根据自己的需求修改格式) date-format: yyyy-MM-dd HH:mm:ss generator: ## 将数值类型转换为字符串,解决long型精度丢失 write_numbers_as_strings: true
@SuppressWarnings("deprecation") @Configuration public class AppWebMvcConfig extends WebMvcConfigurerAdapter{ //省略代码片段 }
方法二:新建WebMvcCofig配置文件,重写数据转换方法。
注意:@EnableMVC注解不可缺失,缺失会导致Long型精度丢失
@SuppressWarnings("deprecation") @Configuration @EnableWebMvc public class AppWebMvcConfig extends WebMvcConfigurerAdapter{ @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters){ FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance(); //支持的数据类型 List<MediaType> supportedMediaTypes = new ArrayList<MediaType>(); supportedMediaTypes.add(MediaType.APPLICATION_JSON); supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8); supportedMediaTypes.add(MediaType.APPLICATION_ATOM_XML); supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED); supportedMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM); supportedMediaTypes.add(MediaType.APPLICATION_PDF); supportedMediaTypes.add(MediaType.APPLICATION_RSS_XML); supportedMediaTypes.add(MediaType.APPLICATION_XHTML_XML); supportedMediaTypes.add(MediaType.APPLICATION_XML); supportedMediaTypes.add(MediaType.IMAGE_GIF); supportedMediaTypes.add(MediaType.IMAGE_JPEG); supportedMediaTypes.add(MediaType.IMAGE_PNG); supportedMediaTypes.add(MediaType.TEXT_EVENT_STREAM); supportedMediaTypes.add(MediaType.TEXT_HTML); supportedMediaTypes.add(MediaType.TEXT_MARKDOWN); supportedMediaTypes.add(MediaType.TEXT_PLAIN); supportedMediaTypes.add(MediaType.TEXT_XML); fastConverter.setSupportedMediaTypes(supportedMediaTypes); serializeConfig.put(Long.class, ToStringSerializer.instance);//Long转String serializeConfig.put(Long.TYPE, ToStringSerializer.instance);//Long转String fastJsonConfig.setSerializeConfig(serializeConfig); fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");//日期格式 fastConverter.setFastJsonConfig(fastJsonConfig); converters.add(fastConverter); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
加载全部内容