bigint 不能被 json.stringify() 直接序列化,因 json 标准不支持该类型;正确做法是用 replacer 函数转为字符串,或配对使用 serializebigint/parsebigint 实现双向转换。
不支持。javascript 中的 bigint 类型不能直接被 json.stringify() 序列化,调用时会立即抛出错误:
JSON.stringify({ x: 123n });
// TypeError: Do not know how to serialize a BigInt
这是因为 JSON 标准(RFC 7159)只定义了六种基础类型(string、number、boolean、null、object、array),不包含 BigInt。而 BigInt 是 ES2020 引入的独立原始类型,语义和底层表示都与 Number 不同,引擎无法安全映射——它既不是浮点数,也不满足 JSON 的 number 定义。
✅ 正确做法:手动转换为可序列化格式
使用 replacer 函数转为字符串(推荐)
最常用、安全且语义清晰的方式是将 BigInt 值转成字符串再序列化,完整保留精度:
const data = { id: 123n, balance: 900719925474099123456789n };
const json = JSON.stringify(data, (key, value) =>
typeof value === 'bigint' ? value.toString() : value
);
// → '{"id":"123","balance":"900719925474099123456789"}'
- 字符串形式可被任意后端语言(如 Java 的
BigInteger、Python 的int)无损解析 - 避免转
Number导致的精度丢失或Infinity
自定义序列化/反序列化配对函数(需还原类型)
如果前端需要在解析后恢复 BigInt,应配套使用 reviver:
function serializeBigint(obj) {
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);
}
// 使用示例
const str = serializeBigint({ amount: 1000000000000000000000n });
const obj = parseBigint(str); // { amount: 1000000000000000000000n }
⚠️ 注意:不要用
value + ""或隐式转换,确保调用.toString();BigInt()构造函数只接受字符串或整数,不接受浮点字符串或空值。
❌ 不推荐的做法
-
直接转
Number:Number(9007199254740993n)→9007199254740992(已失真) -
修改
BigInt.prototype.toJSON:虽能“静默”通过,但影响全局、TS 报错、不解决反序列化问题 -
依赖
eval()或Function构造函数解析:存在严重安全风险
? 前后端协作建议
- API 设计时,约定
BigInt字段(如 ID、时间戳、金额)统一以字符串传输 - 后端按字符串接收,再根据语言特性转为对应大整数类型(如 Java 的
BigInteger、Go 的big.Int) - 避免让后端尝试“理解”
BigInt,JSON 本身就不支持它
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











