当前位置: 首页 > news >正文

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

问题出现

后端的Java Bean的id属性是用的Long类型对应数据库主键使用bigint类型,当使用JSON方式传递该数据给前端时,前端接收到的数据末尾会变成0。(发生的精度丢失问题)

问题原因

Java中的long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值),导致Id最后几位直接变成了0。

解决方案

将后端的id变成字符串类型,前端以字符串的方式接收就不会有精度丢失

方案一:Jackson

单个配置

在Long类型字段上加序列化注解

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

统一配置

需要每一个都指定注解,比较麻烦,下面是统一配置

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@Configuration
public class JacksonConfig {
     @Bean
     @Primary
     @ConditionalOnMissingBean(ObjectMapper.class)
     public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
         ObjectMapper objectMapper = builder.createXmlMapper(false).build();
         SimpleModule simpleModule = new SimpleModule();
         //Long类型----String
         simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
         objectMapper.registerModule(simpleModule);
         return objectMapper;
    }
}

方案二:FastJSON

单个配置

在Long类型字段上加注解Long转String

@JSONField(serializeUsing = ToStringSerializer.class)
private Long userId;

统一配置

通过重写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.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CustomFastJsonConfig {
    @Bean
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        //1.需要定义一个convert转换消息的对象
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();

        //2.添加fastJson的配置信息
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //3.设置Long为字符串
        SerializeConfig serializeConfig = SerializeConfig.globalInstance;
        serializeConfig.put(Long.class, ToStringSerializer.instance);
        serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
        fastJsonConfig.setSerializeConfig(serializeConfig);

        //4.在convert中添加配置信息.
        converter.setFastJsonConfig(fastJsonConfig);
        return converter;
    }
}

后端返回的数据,只要是Long类型的字段,都会被转成String返回,导致扩大了转换范围,不过可以解决所有long类型带来的问题。

注意点

单个属性配置注解的时候:

  • FastJSON使用FastJSON下的ToStringSerializer
  • Jackson使用Jackson下的ToStringSerializer

相关文章:

  • 机器学习之神经网络的公式推导与python代码(手写+pytorch)实现
  • Spring | Spring整合Mybatis
  • 【学生管理系统】权限管理之角色管理
  • Uniapp零基础开发学习笔记(5) -组件入门及容器组件使用
  • HarmonyOS系统中内核实现烟雾检测的方法
  • 【科学文献计量】Networkx基础使用指南
  • 改进YOLOv5 | Stand-Alone Self-Attention | 针对视觉任务的独立自注意力层 | 搭建纯注意力FPN+PAN结构
  • 大数据项目之电商数仓、数据仓库概念、项目需求及架构设计
  • C生万物 | 底层之美,莫过于C【1024,从0开始】
  • Spring Boot集成第三方登录之微信登录
  • 【图像分割】基于遗传算法的进化聚类技术对彩色图像进行分割(Matlab代码实现)
  • Mybatis 拦截器 说明和使用 (二)
  • Vue.js 组件精讲(目前已有6614人一起学习)
  • 【Spring】一文带你吃透IOC技术
  • I2C知识大全系列二 —— I2C硬件及时序
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 时间复杂度分析经典问题——最大子序列和
  • 4. 路由到控制器 - Laravel从零开始教程
  • C学习-枚举(九)
  • HashMap剖析之内部结构
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • IP路由与转发
  • Nodejs和JavaWeb协助开发
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 编写符合Python风格的对象
  • 产品三维模型在线预览
  • 初探 Vue 生命周期和钩子函数
  • 给第三方使用接口的 URL 签名实现
  • 近期前端发展计划
  • 跨域
  • 思否第一天
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 用 Swift 编写面向协议的视图
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​MySQL主从复制一致性检测
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​一些不规范的GTID使用场景
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #DBA杂记1
  • #Z2294. 打印树的直径
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $(selector).each()和$.each()的区别
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (13):Silverlight 2 数据与通信之WebRequest
  • (C语言)fread与fwrite详解
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (vue)页面文件上传获取:action地址
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (汇总)os模块以及shutil模块对文件的操作
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)c++ std::pair 与 std::make
  • (转)C语言家族扩展收藏 (转)C语言家族扩展