如何在 JSON stringify 中處理 BigInt

我們知道 BigInt 類型在 JavaScript 中是一種可用的資料類型,可以表示任意的大整數,當值超出 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