架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3251|回复: 1

[JavaScript] 【实战】前端 JS 解决 JSON 序列化精度丢失问题

[复制链接]
发表于 2022-2-13 14:37:43 | 显示全部楼层 |阅读模式
需求:做了一个在线解析 jwt 的页面,当 jwt 内容有 long 类型的时候,使用默认的 JSON 方法解析会导致精度丢失,如下图:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiaXRzdnNlLmNvbSIsImlkIjo4OTA2MTM1NDg4MDEwNzc5Mjg1fQ.7tJHcSfbpZkgqw0ALGSRxyqkz2-UxZPhO_12TuKNZus

QQ截图20220213130241.jpg

JavaScript 只有一种数字类型:Number,Number是双精度浮点数,与许多其他编程语言不同,JavaScript 不定义不同类型的数字,比如整数、短、长、浮点等等。因此在JavaScript中,数字不分为整数类型和浮点类型,所有的数字都是浮点类型。

在表达整数时,Number能表示的整数范围是[−2的53次方,2的253次方]。因为Number有8个字节64位,其中包括1位符号位,11位指数位,52位尾数位。

可以用Number.MAX_SAFE_INTEGER和Number.MIN_SAFE_INTEGER查看最大安全整数、最小安全整数

后端接口返回 long 类型的字段时候,前端使用 JSON.parse(text) 方式反序列化的显示的时候,会造成显示错误,解决方案就是后端接口将 long 类型的字段转换成 string 类型进行返回。

lossless-json 项目,解析 JSON 而不会有丢失数字信息的风险。GitHub 地址:https://github.com/josdejong/lossless-json

首先,克隆 lossless-json 项目,构建一个捆绑和缩小的库(ES5,电脑需要安装 node.js),首先安装一次依赖项:

然后编译,如下:

QQ截图20220213143218.jpg

./dist/lossless-json.js这将生成一个可以在浏览器和 node.js 中执行的 ES5 兼容包。

通过浏览器控制台测试如下:

QQ截图20220213135238.jpg

修改项目代码,引入 lossless-json.js 文件,调用 LosslessJSON 进行 JSON 序列化和反序列化,修复精度丢失问题,如下图:

let json = LosslessJSON.parse('{"foo":"bar"}'); // {foo: 'bar'}
let text = LosslessJSON.stringify(json);        // '{"foo":"bar"}'

QQ截图20220213143430.jpg

测试地址:https://down.itsvse.com/tools/jwt.html

最后,附上编译后的 lossless-json.js 文件:
游客,如果您要查看本帖隐藏内容请回复

(完)




上一篇:【实战】.NET/C# 使用 StackExchange.Redis 模糊查询导出缓存
下一篇:【实战】Java 使用 hutool 反射无法捕获自定义异常
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-2-13 16:28:40 | 显示全部楼层
又来学习学习。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-4-25 12:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表