javascript解析大整数会因number精度限制导致失真,解决核心是避免转为number而保留字符串或bigint;推荐用json-bigint库,或正则预处理、reviver拦截、后端返回字符串等方案。

直接用 JSON.parse 解析含大整数(如 18 位以上 ID、时间戳、银行卡号)的 JSON 字符串,会导致尾数被四舍五入或归零——这不是 bug,而是 JavaScript Number 类型固有精度限制(安全整数范围仅到 9007199254740991,即 2⁵³ − 1)。解决的核心思路是:**不让大数字落地为 Number,而是保留为字符串或 BigInt**。
用 json-bigint 库替代原生解析
这是最推荐、最稳妥的通用方案,支持完整解析 + 序列化,且已在大量生产项目中验证。
- 安装:
npm install json-bigint(或 pnpm/yarn 对应命令) - 使用:
const JSONbig = require('json-bigint');<br>const data = JSONbig.parse('{"id": 9223372036854775807}');<br>console.log(data.id.toString()); // "9223372036854775807" - 它会自动将超限数字转为
BigInt类型(末尾带n),调用时需用.toString()获取原始字符串值 - 如需序列化回 JSON,用
JSONbig.stringify(data),结果仍为标准 JSON 格式,不含n
手动预处理 JSON 字符串(零依赖方案)
适合不想引入新包、或只需处理固定字段(如 id、userId)的轻量场景。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
- 在调用
JSON.parse前,先用正则把目标字段的数字值包裹成字符串:const safeStr = jsonStr.replace(/"id":(\d{16,})/g, '"id":"$1"'); - 注意正则要匹配字段名 + 冒号 + 连续数字(至少 16 位),避免误伤小数字或浮点数
- 若字段名含下划线、驼峰或多种可能,可扩展为:
/"(id|userId|orderId|timestamp)":(\d{16,})/g - 解析后,这些字段就是字符串类型,后续按需转
BigInt或保持字符串使用(如展示、传参)
配合 reviver 函数做运行时拦截
利用 JSON.parse(text, reviver) 的第二个参数,在解析每个键值对时动态判断并转换。
- 示例:
JSON.parse(jsonStr, (key, value) => {<br> if (key === 'id' || key === 'contentId') return String(value);<br> return value;<br>}); - 优点是逻辑集中、不改原始字符串;缺点是需预先知道哪些字段可能超限,且无法区分“本就是字符串的数字”和“本该是数字的大整数”
- 对后端统一约定用字符串传大数的项目,此方式可作为兜底兼容
后端配合:统一返回字符串格式
最彻底的解法是从源头规避——让后端对所有可能超限的字段(如主键、雪花 ID、长整型金额)直接以字符串形式输出。
- 例如返回:
{"id": "1905066990648586241", "balance": "1234567890123456789"} - 前端无需额外处理,直接
JSON.parse即可拿到字符串,再按需转BigInt或用于展示/请求 - 需前后端约定好字段命名规范与类型语义,适合新项目或可推动后端改造的团队










