如何让JSON.parse()将所有数值类型解析为BigInt类型?
解决JSON解析时大数值丢失精度并转为BigInt的方案
问题核心
原生JSON.parse默认将所有数值解析为64位浮点数Number,当数值超过Number.MAX_SAFE_INTEGER(即2^53 - 1)时会直接丢失精度,仅靠JSON.parse的reviver回调无法拿到原始正确数值。
无依赖实现方案
通过预处理JSON字符串+reviver回调的方式实现,适合轻量场景使用:
function parseJSONWithBigInt(jsonStr) { // 正则匹配JSON中独立的数字字面量(排除字符串字段内的数字),添加专属标记 const processedStr = jsonStr.replace(/(:\s*)(\d+)(\s*[,}\]])/g, (_, prefix, num, suffix) => { return `${prefix}"__BIGINT_MARKER__${num}"${suffix}` }) // 解析时识别标记转为BigInt return JSON.parse(processedStr, (key, value) => { if (typeof value === 'string' && value.startsWith('__BIGINT_MARKER__')) { return BigInt(value.slice(16)) } return value }) }
测试示例
针对提供的JSON数据测试效果如下:
const demoJSON = `{"foo":[[0],[64],[89],[97]],"bar":[[2323866757078990912,144636906343245838,441695983932742154,163402272522524744],[2477006750808014916,78818525534420994],[18577623609266200],[9008333127155712]]}` const parseResult = parseJSONWithBigInt(demoJSON) console.log(parseResult.bar[0][0]) // 输出 2323866757078990912n,精度完整保留
注意:如果你的JSON中存在值为纯数字的字符串字段,需要调整正则规则避免误替换,复杂场景建议使用成熟的第三方库。
第三方库实现方案
如果项目中频繁需要处理大数值JSON,可以直接使用json-bigint库,已经覆盖了各类边界场景:
- 安装依赖:
npm install json-bigint - 使用示例:
import JSONbig from 'json-bigint' const parseResult = JSONbig.parse(demoJSON)
配套序列化方法
如果需要将包含BigInt的对象转回JSON字符串,需要添加replacer处理BigInt类型,避免原生JSON.stringify抛出错误:
function stringifyWithBigInt(obj) { return JSON.stringify(obj, (key, value) => { return typeof value === 'bigint' ? value.toString() : value }) }
内容的提问来源于stack exchange,提问作者mihebo
相关产品推荐
相关产品推荐

