Long类型封装Json传输时精度丢失问题

打印 上一主题 下一主题

主题 1932|帖子 1932|积分 5796

        在信息做传输时,经常会利用到类型转换,这个时间因为一些问题会导致精度的丢失。在付出业务中这种问题更为致命。
        这里我主动天生一个付出订单并将相关信息利用base64编码为一个二维码返回给前端进行付出,前端进行付出时我通过回调方法发现回调消息显示订单不存在

颠末追踪后,发现前端吸收到的订单号与后端向前端发送的订单号不一致


发现产生了精度丢失,导致查询的订单不存在。
原因是订单号是Long类型,在进行base64编码时将全部的信息封装为了Json体进行传输,导致了精度的丧失。
        JavaScript的Number类型基于IEEE 754双精度浮点数尺度,仅能安全表示 ±2^53 - 1 范围内的整数。超过此范围的值会被四舍五入,导致精度丢失。
  1. // JavaScript示例:超过2^53的值会被截断
  2. console.log(1234567890123456789); // 输出:1234567890123456800
复制代码
颠末我的研究和查找资料,以下是两种解决方法:
1.通过注解
在字段上加上@JsonSerialize(using = ToStringSerializer.class)注解,表示在进行Json转换时,自动将其转换为字符串的形式,使前端可以或许取到正确的信息
  1.     /**
  2.      * 本系统支付交易号
  3.      */
  4.     @JsonSerialize(using = ToStringSerializer.class)
  5.     private Long payNo;
  6.     /**
  7.      * 第三方支付交易流水号
  8.      */
  9.     private String outPayNo;
复制代码
2.利用配置
在可以被依赖到的配置类中,添加如下配置
  1. import com.fasterxml.jackson.annotation.JsonInclude;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.fasterxml.jackson.databind.module.SimpleModule;
  4. import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
  5. import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
  6. import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
  7. import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
  11. @Configuration
  12. public Class LToS{
  13. //long转string避免精度损失
  14.     @Bean
  15.     public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
  16.         ObjectMapper objectMapper = builder.createXmlMapper(false).build();
  17.         //忽略value为null 时 key的输出
  18.         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  19.         SimpleModule module = new SimpleModule();
  20.         module.addSerializer(Long.class, ToStringSerializer.instance);
  21.         module.addSerializer(Long.TYPE, ToStringSerializer.instance);
  22.         objectMapper.registerModule(module);
  23.         return objectMapper;
  24.     }
  25. }
复制代码
3.手动修改
        同样可以在进行传输前手动将Long类型强转为String字符串,也可以或许克制前端的精度丢失

通过以上两种方法可以解决Long类型进行传输时的精度丢失问题,通过将Long类型序列化为字符串,可彻底克制前端精度丢失问题。保举利用注解局部控制全局Jackson配置

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表