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