bigint 不能直接 json 序列化,需转字符串或带标记对象处理;推荐 tostring() 转换并配合 replacer/reviver 实现安全序列化与反序列化,避免转 number 导致精度丢失。

BigInt 类型不能直接被 JSON 序列化,调用 JSON.stringify() 会抛出 TypeError: Do not know how to serialize a BigInt。这是由于 JSON 标准本身不支持 BigInt,必须手动处理。
将 BigInt 转为字符串再序列化
最常用且安全的做法是将 BigInt 值转为字符串(.toString()),避免精度丢失。BigInt 本质是任意精度整数,转成字符串能完整保留数值,后续解析时再用 BigInt() 恢复。
- 在
JSON.stringify()的第二个参数(replacer)中识别 BigInt 并转换:
JSON.stringify(obj, (key, value) => typeof value === 'bigint' ? value.toString() : value);
// → '{"id":"123","count":"9007199254740991"}'
自定义序列化与反序列化函数
若项目中频繁使用 BigInt,可封装统一的序列化/解析逻辑,兼顾可读性与类型恢复。
- 序列化:遍历对象,把所有 BigInt 替换为带标记的对象,例如
{ "$bigint": "123" } - 反序列化:用
JSON.parse()的 reviver 参数识别标记并还原为 BigInt
return JSON.stringify(obj, (k, v) => typeof v === 'bigint' ? { $bigint: v.toString() } : v);
}
function parseBigint(json) {
return JSON.parse(json, (k, v) => v?.['$bigint'] !== undefined ? BigInt(v['$bigint']) : v);
}
注意 Number 与 BigInt 的边界问题
不要把 BigInt 转成普通 Number 再序列化,这会导致溢出或精度丢失——JavaScript Number 最大安全整数是 2^53 - 1,超出后无法精确表示。
- 错误示例:
JSON.stringify({ x: 9007199254740992n })若强行转Number,结果可能是9007199254740992(看似一样,但已不可靠) - 更危险的是极大 BigInt,如
1234567890123456789012345678901234567890n,转Number直接变成Infinity或错误值
服务端配合与 API 设计建议
前后端交互时,建议约定 BigInt 字段统一用字符串传输(如 ID、时间戳、大额金额等场景),而非尝试让后端支持原生 BigInt。
- 前端发送前转字符串,后端按字符串接收并自行转为对应大整数类型(如 Java 的
BigInteger、Python 的int) - 响应中 BigInt 字段也以字符串形式返回,前端按需转为
BigInt进行计算 - 避免在 URL 查询参数或表单提交中隐式转 Number,尤其涉及高精度 ID 或加密相关数值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











