文章目录
- 一、前言
- 二、问题描述
- 2.1、问题背景
- 2.2、问题示例
- 三、解决方法
- 3.1、将ID转换为字符串
- 3.2、使用@JsonSerialize注解
- 3.3、使用@JsonFormat注解
一、前言
在后端开发中,我们经常会遇到需要将ID作为标识符传递给前端的情况。当ID为long
类型时,如果该ID超过19位,前端JavaScript在处理时可能会遇到精度问题,导致最后两位变成00
。本文将探讨这一问题的原因以及解决方案。
二、问题描述
2.1、问题背景
在Java中,Long
类型的取值范围是-9223372036854775808
到9223372036854775807
(即-2^64
到2^64-1
)。然而,JavaScript中的Number
类型取值范围是-9007199254740992
到9007199254740991
(即-2^53
到2^53-1
)。当long类型的ID超过JavaScript的Number类型范围时,就容易出现精度丢失的问题。
2.2、问题示例
响应报文Long类型的最后两位变成了00
三、解决方法
3.1、将ID转换为字符串
为了避免精度丢失,我们可以在后端将long类型的ID转换为字符串。这样,无论ID的长度如何,前端都可以正确地接收和处理。
3.2、使用@JsonSerialize注解
我们可以使用@JsonSerialize
注解来指定ID字段的序列化方式。通过ToStringSerializer
类,我们可以确保ID在序列化时被转换为字符串。
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Student {@JsonSerialize(using = ToStringSerializer.class)private long id;private String name;
}
注意:
添加@JsonSerialize
注解后,虽然实体类中id类型是Long,但是返回值中是String类型。
3.3、使用@JsonFormat注解
可以使用@JsonFormat(shape = JsonFormat.Shape.STRING)
将字段转换为String类型
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Student {@JsonFormat(shape = JsonFormat.Shape.STRING)private long id;private String name;
}
响应报文示例: