解説
AIのJSONのIDが1ずれる?JavaScriptへ渡す大きな整数を文字列で守ろう
9007199254740993をNumberとして読むと何が変わるかを検証。AIの出力原文とパーサー通過後を分け、識別子を文字列で渡す条件を整理。

AIが出したJSONの番号をシステムへ渡したら、末尾が1だけ違う。原文の書き間違いとは限らず、読み込み時の数値表現で値が変わることもあるよ。
今回はJavaScriptのNumberで大きな整数を扱う場合に絞る。JSONと変数の基本が分かる人向けに、架空のIDを文字列のまま保つ方法を確認しよう。AIへの実リクエストや実データの送信は使わない例だよ。
整数を連続して正確に表せる範囲がある
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
const a = Number('9007199254740992');
const b = Number('9007199254740993');
console.log(a === b); // true
JavaScriptのNumberは、すべての大きな整数を正確に区別できる形式ではない。MAX_SAFE_INTEGERより大きい領域では、隣り合う整数が同じ数として表される場合があるんだ。
この例では、9007199254740993をNumberへ変えると9007199254740992になる。数値の計算結果が少し違うだけでなく、IDとして別のものを同一視する問題につながるよ。
JSONとして読めることと、元の値が保たれることは別
const parsed = JSON.parse('{"id":9007199254740993}');
console.log(parsed.id); // 9007199254740992
console.log(Number.isSafeInteger(parsed.id)); // false
JSONの構文としては受け取れても、通常のJSON.parseでNumberへ読み込むと、すでにこの変化が起きる。読み込み後の値からString(parsed.id)を作っても、失われた末尾は復元できないよ。
「JSONを検証済みだから番号も原文どおり」とは考えず、構文・型・数値の範囲を分けて確認したいね。
IDを計算しないなら、文字列を契約にする
const parsed = JSON.parse('{"id":"9007199254740993"}');
console.log(parsed.id); // 9007199254740993
console.log(typeof parsed.id); // string
識別のための番号で算術計算が不要なら、先にスキーマや依頼文で文字列と決める方法がある。AIには「idはJSONの文字列。数字だけに見えても数値へ変えず、原文をそのまま転記」と伝え、受信側でも文字列であることを検証する。
数値として届いたものを後から文字列へ直すだけでは、遅いことがあるよ。元資料、AIの出力原文、パーサー、保存先の型まで、変換する場所を確認しよう。
ページ内で読み方を比べる
作例では同じ架空のIDを、JSONの数値と文字列の二通りで読み込む。元の文字列、読み込み後の表示、型、安全な整数かを切り替えて見られる。「最初から試す」で数値の例へ戻るよ。
算術が必要な大きな整数にはBigIntなど別の選択肢もある。ただし、すでにNumberへ変換した値から作っても元の数字は戻らないし、JSONとの受け渡し形式も別に決める必要がある。このページは、IDを文字列で渡す方法に絞っている。
編集部では2026年10月29日にMDNを確認し、Numberの同一化、JSON.parse後の値、文字列での保持をNodeとブラウザで検証した。すべての言語の整数型が同じ制限を持つという意味ではないよ。JSONの段階別検証、先頭ゼロのIDも一緒に確認しよう。
動かしてみよう:JSON / 大きな整数と文字列
設定を切り替え、実際の表示と結果を比べよう。「最初から試す」で初期状態へ戻せるよ。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。