javascript中json.stringify默认不支持bigint,会抛出typeerror;需通过replacer参数将bigint转为字符串以保留精度,或封装safestringify函数统一处理bigint、date等特殊类型。

JavaScript中JSON.stringify默认不支持BigInt,直接调用会抛出TypeError: Do not know how to serialize a BigInt。解决方法是通过replacer参数自定义序列化逻辑,把BigInt转为字符串或数字(需注意精度损失)。
使用replacer函数将BigInt转为字符串
这是最常用且安全的方式,保留完整精度:
- 在
replacer函数中判断值是否为typeof value === 'bigint' - 如果是,返回
value.toString(),确保大整数不丢失位数 - 其他类型正常返回,让
JSON.stringify继续处理
示例:
const obj = { id: 1n, name: "test", count: 9007199254740991n };JSON.stringify(obj, (key, value) => typeof value === 'bigint' ? value.toString() : value);
// → {"id":"1","name":"test","count":"9007199254740991"}
全局统一处理:封装可复用的序列化函数
避免每次手动写replacer,可封装一个健壮的safeStringify:
- 检查输入是否为
null或基本类型,直接返回 - 对
BigInt、Date、undefined等特殊值做分类处理(undefined会被自动忽略,但显式处理更清晰) - 保持原有对象结构,只替换不可序列化的值
示例:
function safeStringify(obj) {return JSON.stringify(obj, (key, value) => {
if (typeof value === 'bigint') return value.toString();
if (value instanceof Date) return value.toISOString();
return value;
});
json-bigint)
若项目复杂度高或需长期维护,可考虑成熟库:
-
json-bigint:专为支持BigInt设计,解析时还能把字符串还原回BigInt -
flatted:轻量级,支持BigInt、Map、Set等,适合需要扩展序列化能力的场景 - 引入成本低,但需评估是否值得增加依赖
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











