Long类型数据,后端序列化为Json传给前端,产生的精度丢失的问题

目录

  • 问题描述
  • 问题产生的原因
  • 解决问题
    • 1.把Long类型改为String类型,但是如果Long类型很多的话,改起来很麻烦
    • 2.给字段加注解,序列化为String,同上,有点麻烦
    • 3.本文中使用的是Spring boot、FastJson,通过重写WebMvcConfigurer中的configureMessageConverters方法来重新配置转换器

问题描述

表中的Id字段是mybitis-plus雪花算法生成的19位Id,后端返回给前端的结果封装中,有这个Id字段,具体返回为

return JSON.parseObject(redisValue, Result.class);

redisValue是保存在redis中的String类型的value(文章列表,包括文章Id,title等),请求后端接口的时候,先去redis中查找看是否有对于的key,若有的话,直接返回value,因为value为String类型,需要使用fastjson的格式化工具将String转为Result对象返回给前端

走缓存返回给前端的结果中Id是正确的,如图
Long类型数据,后端序列化为Json传给前端,产生的精度丢失的问题_第1张图片

但是再去点击某篇文章查看详情的时候,文章Id变成了这样
在这里插入图片描述
超过17位的最后两位直接丢失,导致拿着丢失精度之后的Id再去后端查数据根本查不到。

问题产生的原因

Long类型的数据,如果我们在后端将结果序列化为json,直接传给前端的话,在Long长度大于17位时会出现精度丢失的问题。
java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值),比如此案例中Id最后两位直接变成了0

解决问题

1.把Long类型改为String类型,但是如果Long类型很多的话,改起来很麻烦

2.给字段加注解,序列化为String,同上,有点麻烦

@JsonSerialize(using = ToStringSerializer.class)
private Long id;

3.本文中使用的是Spring boot、FastJson,通过重写WebMvcConfigurer中的configureMessageConverters方法来重新配置转换器

import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.math.BigInteger;
import java.util.List;

@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
        serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
        serializeConfig.put(Long.class, ToStringSerializer.instance);
        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
        fastJsonConfig.setSerializeConfig(serializeConfig);
        converter.setFastJsonConfig(fastJsonConfig);
        converters.add(converter);
    }
}

你可能感兴趣的:(Java开发学习笔记,java,redis,json)