如何在 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
);

参考资料

javascript json