论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
前端开发
›
办理前端精度丢失问题:后端Long类型到前端的处理计谋 ...
办理前端精度丢失问题:后端Long类型到前端的处理计谋 ...
立聪堂德州十三局店
金牌会员
|
2024-6-11 11:04:33
|
显示全部楼层
|
阅读模式
楼主
主题
858
|
帖子
858
|
积分
2574
在Web开辟中,我们经常遇到前后端数据类型不匹配的问题,特殊是当后端利用大数据类型如Long时,前端由于JavaScript的数字精度限制,大概导致精度丢失。本文将深入探讨这个问题,并提供两种有用的办理方法。
一、问题配景
在后端开辟中,为了确保数据的完整性和精度,我们大概会选择利用Long类型来存储某些数据,如订单ID、用户ID等。然而,当这些数据通过API传输到前端时,由于JavaScript中Number类型的精度限制(最大安全整数为2^53-1),假如Long类型的值超过了这个范围,就大概导致精度丢失。
二、办理方法
针对这个问题,我们可以接纳以下几种办理方法:
方法一:利用@JsonSerialize注解将Long类型转换为String类型
在Java后端中,我们可以利用Jackson库的注解功能,将Long类型的字段在序列化为JSON时转换为String类型。这样,前端接收到的数据就是字符串情势,避免了精度丢失的问题。
示例代码如下:
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.Data;
@Data
public class PayOrderVo {
// 使用ToStringSerializer将Long类型的id字段转换为String类型
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
// 其他字段...
}
复制代码
通过这种方式,我们可以确保后端返回的JSON中,Long类型的字段都以字符串的情势存在,前端可以直接将其作为字符串处理,无需担心精度问题。
方法二:利用@JsonFormat注解将Long类型格式化为String
除了利用ToStringSerializer,Jackson还提供了@JsonFormat注解,它答应我们指定字段的序列化格式。当我们将shape属性设置为JsonFormat.Shape.STRING时,Long类型的字段也会被格式化为字符串。
示例代码如下:
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@Data
public class PayOrderVo {
// 使用@JsonFormat注解将Long类型的id字段格式化为String
@JsonFormat(shape = JsonFormat.Shape.STRING)
private Long id;
// 其他字段...
}
复制代码
这种方法同样可以确保Long类型的字段在序列化为JSON时以字符串情势出现,避免前端精度丢失的问题。
前两种通过注解的方式确实可以有用地办理Long类型数据在前后端传输中的精度丢失问题。然而,当项目中存在多个类,且这些类中的多个字段都必要将Long类型转换为String类型返回给前端时,逐一为每个字段添加注解不仅繁琐,还大概导致代码冗余和难以维护。为了更优雅、高效地办理这一问题,我们可以考虑利用全局设置的方式,一次性办理全部Long类型字段的序列化问题。这样,我们不仅能提高开辟效率,还能确保代码的同等性和可维护性。接下来,我们将详细探讨怎样通过全局设置来实现这一目标。
方法三:全局设置Jackson将Long类型序列化为String
除了对单个字段进行注解设置外,我们还可以进行全局设置,使得全部Long类型的字段在序列化时都自动转换为String类型。这样可以淘汰在每个字段上添加注解的重复工作。
示例代码如下:
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
@Configuration
public class JacksonConfig {
@Bean
@Primary
@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
SimpleModule simpleModule = new SimpleModule();
// 将Long类型序列化为String类型
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
return objectMapper;
}
}
复制代码
在这个设置中,我们创建了一个自定义的ObjectMapper Bean,并注册了一个SimpleModule,该模块利用ToStringSerializer将Long类型序列化为String类型。这样,整个应用中全部Long类型的字段在序列化时都会自动转换为String类型。
三、总结
前端精度丢失问题是一个常见的挑战,但通过上述三种方法,我们可以有用地办理这个问题。在现实开辟中,我们可以根据项目的详细情况和需求选择符合的方法。对于必要准确表示大数字的场景,将Long类型转换为String类型是一个简单而有用的办理方案。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
立聪堂德州十三局店
金牌会员
这个人很懒什么都没写!
楼主热帖
零信任介绍
哈夫曼应用
WPF开发随笔收录-获取软件当前目录的坑 ...
【iOS逆向与安全】frida-trace入门 ...
《微信小程序-基础篇》什么是组件化以 ...
计算机等级考试二级C语言上机题集(第1 ...
VMware虚拟机安装Linux教程(超详细) ...
K8S 1.20 弃用 Docker 评估之 Docker C ...
2021年7月整理--简单方法 暴力破解WIFI ...
day33-JSON&Ajax01
标签云
存储
挺好的
服务器
浏览过的版块
网络安全
快速回复
返回顶部
返回列表