@JsonDeserialize注解解决前后端json传输丢失精度问题

一、问题背景

在我们的项目中经常会有前端解析后端返回的数据出现精度丢失的问题,如下所示:

后端返回前端的数据:
uuid:1534595659129294849
前端解析后的数据:
uuid:1534595659129294800

原因如下:
在JavaScript中,存在两种数字。Number和BigInt。最常用的,就是number。最大的Number,叫做Number.MAX_SAFE_INTEGER,它的值为:
2^53-1 或者+/- 9,007,199,254,740,991
众所周知,Java中的Long,是64位的。Js中的这个Number在长度大于17位时会出现精度丢失的问题。

二、解决方案

1.简单的解决方案只需要使用fastjson的ToStringSerializer注解,让系统序列化时,保留相关精度即可。

@JsonSerialize(using = ToStringSerializer.class)
    private String uuid;

2.当然我们也可以对using的值自己进行拓展,实现不同的转换,例如

自定义一个类来继承JsonSerializer类来重写serialize方法,进行自定义转换
public class DateToLongSerializer extends JsonSerializer<Date> {
    @Override
    public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        jsonGenerator.writeNumber(date.getTime() / 1000);
    }
}
类字段上声明注解
@JsonSerialize(using = DateToLongSerializer.class)
    private Date createTime;

3.我们也可以使用全局配置的方式

spring.jackson.generator.write-numbers-as-strings=true
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值