javascript エラー「Uncaught TypeError: Do not know how to serialize a BigInt」の解決方法

javascript エラー「Uncaught TypeError: Do not know how to serialize a BigInt」の解決方法

javascriptで、エラー「Uncaught TypeError: Do not know how to serialize a BigInt」が発生した場合の原因と解決方法を記述してます。「JSON.stringify」に「bigint」を使用した場合に発生します。「chrome」や「firefox」や「safari」の各ブラウザのエラーメッセージの画像もキャプチャしてます。

環境

  • OS windows11 pro 64bit
  • ブラウザ chrome 108.0.5359.125

エラー内容

以下の、「JSON.stringify」に「bigint」型を使用した際に発生。

JSON.stringify({a: 1n});

エラーメッセージ

Uncaught TypeError: Do not know how to serialize a BigInt
    at JSON.stringify (<anonymous>)

画像

firefox107の場合では、以下のエラーが発生します。

Uncaught TypeError: BigInt value can't be serialized in JSON

画像

safari15.5では、以下のエラーとなります。

TypeError: JSON.stringify cannot serialize BigInt.

画像

原因

「JSON.stringify」は「bigint」を使用できないため

解決方法

「Number」に変換して使用する。

const result = JSON.stringify({ a: 1n, b: 10, c: 100n },(k,v) => 
  { return typeof v === 'bigint' ? Number(v) : v }
);

console.log( result );
// {"a":1,"b":10,"c":100}

除去して使用するのもありかと思います。

const obj = { a: 1n, b: 10, c: 100n };

Object.keys(obj).forEach(v => {
  if (typeof obj[v] === 'bigint') {
    delete obj[v];
  }
});

const result = JSON.stringify(obj);

console.log( result );
// {"b":10}

または、「bigint」が含まているか判定してから使用する方法もあります。

const obj = { a: 1n, b: 10, c: 100n };

let flg = true;

Object.keys(obj).forEach(v => {
  if (typeof obj[v] === 'bigint') {
    flg = false;
  }
});

let result = (flg) ? JSON.stringify(obj) : '無効な値が含まれています';

console.log( result );
// 無効な値が含まれています