javascript原生json不支持bigint,需通过replacer将bigint转为{"$bigint":"..."}结构,再用reviver还原;可封装safestringify/safeparse工具函数,或改用superjson、lossless-json等第三方方案。

JavaScript 原生 JSON.stringify() 和 JSON.parse() 不支持 BigInt,直接序列化会报错:TypeError: Do not know how to serialize a BigInt。解决的核心思路是:**手动接管序列化与反序列化过程,用字符串暂存 BigInt,再按需还原**。
序列化 BigInt:转成字符串并加标记
默认 JSON 无法表示 BigInt,但字符串可以无损保存其字面量(如 "123456789012345678901234567890")。关键是让解析方知道哪些字段原本是 BigInt。
- 推荐在序列化时,用自定义 replacer 把
BigInt转为带类型标识的对象,例如{ "$bigint": "12345678901234567890" } - 避免只存纯字符串(如
"1234567890..."),否则无法区分普通数字字符串和 BigInt 字符串 - 示例:
const obj = { id: 123n, name: "test" };
JSON.stringify(obj, (key, value) =>
typeof value === "bigint" ? { "$bigint": value.toString() } : value
);
// → '{"id":{"$bigint":"123"},"name":"test"}'
反序列化 BigInt:识别标记并还原
JSON.parse() 的 reviver 参数可用于递归检查每个值,遇到 {"$bigint": "..."} 结构就转回 BigInt。
- reviver 函数中判断是否为
{ $bigint: string }形式,且该字符串符合 BigInt 字面量格式(可选校验) - 注意:不能对所有字符串调用
BigInt(),否则非数字字符串会抛错 - 示例:
JSON.parse(jsonStr, (key, value) => {
if (value && typeof value === "object" && "$bigint" in value) {
return BigInt(value.$bigint);
}
return value;
});
封装成可复用的工具函数
把上述逻辑打包,便于项目统一使用:
- safeStringify:兼容普通值 + BigInt,自动标记
-
safeParse:自动识别并还原
$bigint字段 - 可扩展支持其他不可序列化类型(如
Date、Map),只要约定好标记键名(如$date、$map) - 注意:服务端若也需处理,需同步实现相同协议(比如后端收到
{"$bigint": "..."}主动转为大整数类型)
替代方案:用第三方库或改用其他格式
如果项目允许引入依赖,可考虑:
-
flatted或superjson:内置 BigInt 支持,自动处理循环引用、函数等 -
lossless-json:专为精确数值设计,保留整数精度,适合金融/ID 场景 - 换用
MessagePack或Protocol Buffers:二进制格式天然支持 64 位以上整数,但需前后端协议一致
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











