DESIGN / CODE / INFRA / AI

解説

AIのJSONのIDが1ずれる?JavaScriptへ渡す大きな整数を文字列で守ろう

9007199254740993をNumberとして読むと何が変わるかを検証。AIの出力原文とパーサー通過後を分け、識別子を文字列で渡す条件を整理。

AIのJSONのIDが1ずれる?JavaScriptへ渡す大きな整数を文字列で守ろう
保存リストを見る →
この記事の道しるべ 4項目

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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。