JavaScript接收后端Long类型数据精度丢失问题

在开发过程中,通常我们的数据库主键会使用 bigint,它对应 Java 中的 Long,但是当Long的数值超过一定值时传到前端后会丢失精度。原因是JavaScript的number类型有个安全值,即2的53次方,为9007199254740991,如果超过这个值,那么JavaScript会出现不精确的问题。

我们可以直接在浏览器中打印出JavaScript的number类型有个安全值,如下图所示:

JavaScript的number类型有个安全值

如何解决这个问题呢?最简单的办法就是直接后台在返回给前端的时候,把 Long 类型的数据转换成字符串即可。如果自己手动转我想这个会是一个工作量不小的活,那我们怎么安全快速的解决这个问题呢?

  • 方案一

    如果你们是使用jackson框架的话,可以在相应的字段上加上以下的注解(若是用的 FastJson 也有相应的注解)

    1
    2
    3
    4
    5
    6
    import com.fasterxml.jackson.databind.annotation.JsonSerialize;
    import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
    //序列化成String的传

    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
  • 方案二

    可以自定义Jackson的ObjectMapper

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public 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 等

  • 作者: Sam
  • 发布时间: 2020-08-26 22:30:22
  • 最后更新: 2020-08-27 22:30:42
  • 文章链接: https://ydstudios.gitee.io/post/175ad151.html
  • 版权声明: 本网所有文章除特别声明外, 禁止未经授权转载,违者依法追究相关法律责任!