BigInt 无法直接 JSON 序列化或解析,需序列化前转字符串、解析时按约定还原为 BigInt;推荐用 replacer/reviver 处理或 json-bigint 库,并推动后端统一返回字符串以保障精度。
bigint 不能直接参与 json 序列化或解析,因为 json 标准不支持该类型。直接调用 json.stringify() 会抛出 typeerror: do not know how to serialize a bigint;而原生 json.parse() 会把超长数字自动转为 number,导致精度丢失(比如 snowflake id、纳秒时间戳、大额金额)。解决核心是:序列化前手动转换,解析时主动还原。
序列化时把 BigInt 转成字符串
最稳妥通用的做法是用 JSON.stringify 的 replacer 参数识别并转换:
- 所有
typeof value === 'bigint'的值,统一调用value.toString() - 字符串格式能完整保留数值,且语义清晰、后端易处理(如接收为字符串再转 BigInteger)
- 避免转成
Number——Number最大安全整数是2<sup>53</sup> - 1,超出即不可靠
反序列化时按约定还原为 BigInt
仅转字符串还不够,接收方需知道哪些字段本应是 BigInt 并主动恢复:
- 推荐在序列化时加标识,例如字段名以
_big结尾,或嵌套对象{ "$bigint": "1234567890" } - 用
JSON.parse(json, reviver),在reviver中检测标识并调用BigInt(value) -
BigInt()只接受字符串或整数,不能传空串、浮点字符串或undefined
用 json-bigint 库简化流程
项目中频繁处理大整数时,可引入 json-bigint 统一接管:
- 安装:
npm install json-bigint - 启用原生 BigInt:
const JSONbig = require('json-bigint')({ useNativeBigInt: true }); - 解析自动将超长数字转为
BigInt,序列化也默认保持类型,无需手写replacer/reviver - 注意:它替换的是
JSON.parse/stringify行为,不要与原生 JSON 混用,避免类型不一致
前后端协作的关键约定
单靠前端处理治标不治本,长期建议推动接口层规范:
立即学习“Java免费学习笔记(深入)”;
- 后端对可能超长的字段(如
id、timestamp_ns、amount_cents)统一返回字符串 - 前端收到后按需转
BigInt或继续以字符串使用(如仅展示、传参) - 禁止前端用
parseInt、Number()或一元加号+str解析长数字——解析瞬间就丢精度


















