You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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库,已经覆盖了各类边界场景:

  1. 安装依赖:npm install json-bigint
  2. 使用示例:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 01:15:00