在开发过程中,通常我们的数据库主键会使用 bigint,它对应 Java 中的 Long,但是当Long的数值超过一定值时传到前端后会丢失精度。原因是JavaScript的number类型有个安全值,即2的53次方,为9007199254740991,如果超过这个值,那么JavaScript会出现不精确的问题。
我们可以直接在浏览器中打印出JavaScript的number类型有个安全值,如下图所示:
如何解决这个问题呢?最简单的办法就是直接后台在返回给前端的时候,把 Long 类型的数据转换成字符串即可。如果自己手动转我想这个会是一个工作量不小的活,那我们怎么安全快速的解决这个问题呢?
方案一
如果你们是使用jackson框架的话,可以在相应的字段上加上以下的注解(若是用的 FastJson 也有相应的注解)
1
2
3
4
5
6import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
//序列化成String的传
.class) (using = ToStringSerializer
private Long id;方案二
可以自定义Jackson的ObjectMapper
1
2
3
4
5
6
7
8
9
10
11
12public class CustomJacksonObjectMapper extends ObjectMapper {
public CustomJacksonObjectMapper() {
super();
// 设置日期转换yyyy-MM-dd HH:mm:ss
setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// 序列换成json时,将所有的long变成string,因为js中得数字类型不能包含所有的java long值
SimpleModule simpleModule = new SimpleModule("LongModule", new Version(1, 0, 0, ""));
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
registerModule(simpleModule);
}
}方案三
前端自己解决,使用第三方库如json-bigint 等