ビギンとJSON.Stringify/JSONパース


この文書の中でJSON.parse 新しいJavaScriptタイプをシリアル化できませんBigInt .
次のように想像してください
const data = {
  value1: BigInt('1231231231231231213'),
  deep: {
    // NOTE the "n" at the end -- also a BigInt!
    value2: 848484848484848484884n,
  }
}
あなたがちょうど試みるならばJSON.stringify(data) エラーが出ますTypeError: Do not know how to serialize a BigInt .

直列化と逆シリアル化
それはあなたのbigintsをシリアル化する方法を選択する方法をあなたのbigintsを逆シリアル化に影響を与えることに注意する必要があります.一般的には、“init”の末尾に“n”接尾辞を追加することで、それらをシリアル化します.( BigInt(0) and 0n も同じ結果を返す).

連載
ここではJSON.stringify 's番目の引数null !!! ハハ.これはreplacer . 提供されるならば、この機能の仕事はそれのキーと値から何かに基づいて何かを直列化する方法を決定することです.If the typeof the value is "bigint" , 我々はそれを文字列に変換し、タック"n" 最後まで.
// Serialization
const json = JSON.stringify(data, (key, value) =>
  typeof value === "bigint" ? value.toString() + "n" : value
);
結果:json
{
  "value1": "1231231231231231213n",
  "deep": {
    "value2": "848484848484848484884n",
  }
}

逆シリアル化
我々が上に持っているものを逆シリアル化するために、我々は2番目の引数をJSON.parse() . (私はほとんどの人が2番目の引数を持っていることを知りませんでしたreviver , そして、それは仕事の基本的に反対のreplacer 上記.
ここでは、値の型と形をテストして、それが続く数の束と一致することを確認します"n" .
// Deserialize
const backAgain = JSON.parse(json, (key, value) => {
  if (typeof value === "string" && /^\d+n$/.test(value)) {
    return BigInt(value.substr(0, value.length - 1));
  }
  return value;
});

代替連載
これはすべての少しトリッキーなので、あなたの他のデータのどれも、それが数字の束と1の形式であることを確認する必要があります"n" 最後に.もしそうなら、シリアル化戦略を変更する必要があります.たとえば、おそらくあなたはBigInt::1231232123 以下の例のように、反対側で同じように逆シリアル化します.
// Serialize
const json = JSON.stringify(data, (key, value) =>
  typeof value === "bigint" ? `BIGINT::${value}` : value
);

// Deserialize
const backAgain = JSON.parse(json, (key, value) => {
  if (typeof value === "string" && value.startsWith('BIGINT::')) {
    return BigInt(value.substr(8));
  }
  return value;
});
選択は本当にあなたに、ちょうどあなたがそれを行うためのツールを持っている限りです.