@JsonSerialize(using = ToStringSerializer.class) 为什么能解决前后端 Long 精度丢失问题

目录

  • 前言
  • [1. 原理](#1. 原理)
  • [2. 解决方式](#2. 解决方式)

前言

Java基本知识:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

数据库中的 ID: 1729832798127398123

后端接口返回:

java 复制代码
{
  "id": 1729832798127398123
}

后端日志打印也完全正常。

但是到了前端:1729832798127398000

数字发生了变化,精度丢失了

这时候如果加上:

java 复制代码
@JsonSerialize(using = ToStringSerializer.class)
private Long id;

前端 suddenly 就正常了

1. 原理

Java 的 Long:

Long 最大值:9223372036854775807

是 64 位整数。

但是前端 JavaScript 的 Number:

java 复制代码
Number.MAX_SAFE_INTEGER
// 9007199254740991

只能安全表示:2^53 - 1

也就是说:

Java Long 是 64 位

JS Number 只有 53 位精度

超过这个范围:1729832798127398123

JavaScript 无法精确表示。
1729832798127398123会被自动转换成:1729832798127398100

出现精度丢失。

2. 解决方式

方案一:字段加注解(最常见)

java 复制代码
@JsonSerialize(using = ToStringSerializer.class)
private Long id;

优点:

简单

精准控制

缺点:

每个字段都要写

方案二:全局配置(推荐)

java 复制代码
@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
        return builder -> {
            builder.serializerByType(Long.class, ToStringSerializer.instance);
            builder.serializerByType(Long.TYPE, ToStringSerializer.instance);
        };
    }
}
相关推荐
2601_9621066417 小时前
【Java Set综合实战】商品管理系统 + 图书收藏系统|Product、Book自定义类全套代码
java
RuoyiOffice17 小时前
SpringBoot+Vue3 凭证生命周期设计:审核、过账、冲销与反过账怎样保持账目一致
java·spring boot·事务·springboot3·财务系统·会计凭证·ruoyi office
2601_9621066418 小时前
HashMap入门|工号-姓名键值存储、两种遍历方式、根据key/value查
java
杨凯凡18 小时前
Spring Framework 7 API 版本管理实战:请求头路由、兼容迁移与废弃策略
java·rest api·springframework·spring boot 4·api版本管理
T_Wizard19 小时前
同一个问题写了 4 遍:官方 SDK / HTTP / Spring AI / LangChain4j,到底该选哪个
java·ai编程
hai_android19 小时前
AudioTrack 深度解析:从原理到实战
android·java·kotlin
斯维赤19 小时前
限流、熔断、降级,你真的分得清吗?
java·后端·架构
aiks_yuan1 天前
Java CPU 100% 怎么排查:JDK 11 起 jstack 自带线程 CPU 时间,不用再 top -H 换算十六进制(JDK 8、11、17 实测)
java
Flynn Liang1 天前
AiServices 源码级拆解:一个接口如何变成 RAG Agent
java·langchain·源码分析·rag·langchain4j·aiservices
Flynn Liang1 天前
LangChain4j 1.23 架构全景:Java 大模型应用的 6 层抽象
java·langchain·大模型·rag·ai agent·langchain4j