如何在 JSON stringify 中处理 BigInt
我们知道,JavaScript 中 BigInt 类型是一种能够表示任意大整数的数据类型,当值超出 number
所能表示的范围时,这是一个很好的补充。然而,当你使用需要以 JSON
格式交换数据的应用程序时,BigInt
值就会成为一个问题,因为 JSON
默认情况下不知道如何序列化 BigInt
值,在这种情况下,一种解决方案是将 BigInt
转换为 string
,正如这篇文章所示。
The problem
> const obj = {
... name: 'andy',
... age: 36,
... money: 1000000000000000000000000n
... }
undefined
> JSON.stringify(obj)
Uncaught TypeError: Do not know how to serialize a BigInt
at JSON.stringify (<anonymous>)
The solution
- Monkey patch
BigInt
:
> BigInt.prototype.toJSON = function () {
... return this.toString();
... }
[Function (anonymous)]
> JSON.stringify(obj)
'{"name":"andy","age":36,"money":"1000000000000000000000000"}'
- Handle specific bigint field:
const obj = {
name: 'andy',
age: 36,
money: 1000000000000000000000000n
};
// stringify
function replacer(key, value) {
if (key === 'money') {
return value.toString();
}
return value;
}
const stringified = JSON.stringify(obj, replacer);
// parsing
function reviver(key, value) {
if (key === 'money') {
return BigInt(value);
}
return value;
}
const payload = '{"name":"andy","age":36,"money":"1000000000000000000000000"}';
const parsed = JSON.parse(payload, reviver);
- Handle any value that is bigint:
JSON.stringify(this, (key, value) =>
typeof value === 'bigint'
? value.toString()
: value // return everything else unchanged
);
参考资料