json.stringify() 默认不支持 bigint 是因 json 规范未定义该类型,遇 bigint 会抛 typeerror;解决方法包括自定义 replacer 函数、预处理数据或使用第三方库,但需注意类型信息丢失及反序列化时需手动转换。

JavaScript 的 JSON.stringify() 默认不支持 BigInt,直接序列化会抛出 TypeError: Do not know how to serialize a BigInt。这不是 bug,而是标准行为——因为 JSON 规范本身不定义 BigInt 类型。
为什么 JSON.stringify 会报错
JSON.stringify() 只能处理有限的原始类型(string、number、boolean、null、object、array),而 BigInt 不在其中。当遍历对象时遇到 BigInt 值(如 123n),它无法将其转换为合法 JSON 字符串,于是中止并报错。
三种常用解决方法
可根据场景选择合适方式,避免崩溃:
-
自定义 replacer 函数:在
JSON.stringify()第二个参数中传入函数,把BigInt转成字符串(推荐用于临时兼容)JSON.stringify(obj, (key, value) => typeof value === 'bigint' ? value.toString() : value) -
预处理数据:遍历对象,提前将所有
BigInt字段转为字符串或普通数字(适合结构固定、可控制输入的场景)
例如:obj.id = obj.id?.toString(); -
使用第三方库(如 flatted、json-bigint):提供更健壮的序列化/反序列化支持,部分还支持还原
BigInt(适合需要往返转换的系统)
注意事项与陷阱
直接转字符串虽简单,但丢失了类型信息,反序列化后是字符串而非 BigInt;若需还原,必须额外约定字段含义并手动调用 BigInt()。另外,JSON.parse() 永远不会自动产生 BigInt,必须显式转换。
服务端交互中的常见做法
前后端约定将 BigInt 字段以字符串形式传输(如 ID、时间戳),前端收到后按需转为 BigInt 进行高精度计算。这样既兼容 JSON 标准,又保留精度能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











