javascript中json默认不支持bigint,需通过replacer函数将其转为字符串序列化,反序列化时用reviver还原;也可用json-bigint库或封装工具函数实现双向精确传输。

JavaScript 中 JSON 默认不支持 BigInt 类型,直接调用 JSON.stringify() 会抛出 TypeError: Do not know how to serialize a BigInt。解决的关键是自定义序列化逻辑,把 BigInt 转成安全的字符串或数字表示。
用 replacer 函数转成字符串
最常用且兼容性好的方式是在 JSON.stringify() 的第二个参数(replacer)中处理 BigInt:
- 检测值是否为
typeof value === 'bigint' - 将其转为字符串(如
value.toString()),避免精度丢失 - 注意:接收方需约定好反序列化时还原为
BigInt,不能直接用JSON.parse()
const obj = { id: 1n, count: 9007199254740991n };
JSON.stringify(obj, (key, value) =>
typeof value === 'bigint' ? value.toString() : value
);
// → '{"id":"1","count":"9007199254740991"}'
自定义序列化/反序列化封装
为避免每次手动写 replacer,可封装成工具函数,并配套提供解析方法:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 序列化时统一将
BigInt转字符串,并加标识(如{"_type": "bigint", "value": "..."}) - 反序列化时用
JSON.parse()的 reviver 参数识别并还原 - 适合需要双向精确传输的场景,比如前后端通信、本地存储
// 序列化
function serializeBigInt(obj) {
return JSON.stringify(obj, (k, v) =>
typeof v === 'bigint' ? { _type: 'bigint', value: v.toString() } : v
);
}
<p>// 反序列化
function deserializeBigInt(str) {
return JSON.parse(str, (k, v) => {
if (v && typeof v === 'object' && v._type === 'bigint') {
return BigInt(v.value);
}
return v;
});
}</p>
使用第三方库(如 json-bigint)
如果项目允许引入依赖,json-bigint 是成熟方案:
- 自动识别
BigInt并序列化为字符串,反序列化时还原 - 支持
strict: false模式兼容老数据(如数字字面量超 safe integer) - 注意:它不修改原生
JSON,需显式调用JSONbig.stringify()和.parse()
npm install json-bigint
// ...
const JSONbig = require('json-bigint');
const str = JSONbig.stringify({ x: 123n });
// → '{"x":"123"}'
const obj = JSONbig.parse(str);
// → { x: 123n }
注意事项和边界情况
实际使用中容易忽略的细节:
-
BigInt不能参与 JSON 原生解析,JSON.parse('{"n": 1n}')语法错误,必须先字符串化再处理 - 转成普通数字(如
Number(value))会丢失精度,尤其大于2^53 - 1时,应避免 - 某些 API(如
fetch请求体)默认用原生JSON.stringify,需提前处理对象 - 服务端若为 Node.js,也要确保能正确解析字符串形式的
BigInt,否则可能存为字符串而非数值类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










