BigInt 无法被原生 JSON.stringify() 序列化,需通过自定义 replacer 将其转为字符串,再用 reviver 函数在 JSON.parse() 时还原;也可封装工具函数或改用 MessagePack/Protocol Buffers 等支持 BigInt 的序列化方案。

JavaScript 中的 BigInt 无法被原生 JSON.stringify() 序列化,会直接抛出 TypeError。解决这个问题需要手动处理,核心思路是将 BigInt 转为可序列化的格式(如字符串),并在反序列化时还原。
使用自定义 replacer 函数序列化
在调用 JSON.stringify() 时传入第二个参数 —— replacer 函数,对 BigInt 类型值进行特殊处理:
- 检测值是否为
typeof value === 'bigint' - 将其转为字符串(推荐用
value.toString()),避免精度丢失 - 其他类型值保持原样返回
示例:
const data = { id: 123n, count: 9007199254740992n };JSON.stringify(data, (key, value) => typeof value === 'bigint' ? value.toString() : value);
// → '{"id":"123","count":"9007199254740992"}'
反序列化时还原 BigInt
JSON.parse() 默认不识别字符串形式的整数为 BigInt,需配合 reviver 函数判断并转换:
- 检查值是否为字符串,且只包含数字(可选支持负号)
- 确认该字符串原本就表示一个大整数(例如长度超过 15 位、或明确知道某字段应为
BigInt) - 谨慎使用全局正则匹配,建议结合字段名或 schema 约定
安全做法(按字段名还原):
JSON.parse(json, (key, value) => {
if (key === 'id' || key === 'count') return BigInt(value);
return value;
});
封装成可复用的工具函数
把序列化和反序列化逻辑封装起来,便于项目统一使用:
-
serializeBigInt(obj):递归处理对象/数组中的BigInt -
deserializeBigInt(json, schema?):支持字段白名单或简单类型提示(如{ id: 'bigint' }) - 注意:不要无差别将所有长数字字符串转为
BigInt,可能误伤普通 number 或 ID 字符串
替代方案:使用 MessagePack 或 Protocol Buffers
若项目允许引入外部序列化协议,可考虑:
-
msgpack-javascript 支持
BigInt(需启用useBigInt64选项) - Protocol Buffers(通过
int64/uint64字段映射到BigInt) - 优势:二进制体积小、跨语言兼容性好、天然支持大整数
适合高频通信或后端协同场景,但增加了依赖和协议约定成本。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











