JSON stringify で BigInt を処理する方法

ご存知のとおり、BigInt 型は、任意の大きな整数を表すことができるデータ型として JavaScript で使用できます。これは、値が number で表せる範囲を超える場合の補助として役立ちます。ただし、JSON 形式でデータを交換する必要があるアプリケーションで作業する場合、JSON はデフォルトで BigInt 値をシリアル化する方法を認識しないため、BigInt 値が問題になります。このような場合、1 つの解決策は、この投稿で示されているように、BigIntstring に変換することです。

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