>_toolkitbox

~/tools / LLM JSON Repair

LLM JSON Repair — AIモデルが返した壊れたJSONを修復します

AIモデルが返す「ほぼJSON」を修復します。コードフェンスや前置きの文章を取り除き、末尾のカンマやコメントの削除、引用符・キー・Pythonの値の修正を行い、変更した内容を一覧で示します。入力した内容はブラウザの外に出ません。

インデント

答えが一つに決まる修正だけを適用します。それ以外は推測せず、位置とともに報告します。

すべてブラウザの中で処理します。貼り付けたテキストはアップロードされません。

言語モデルは、JSONをコードフェンスと一文で包んだうえに、末尾のカンマ、シングルクォート、コメント、true の代わりの True など、構文を崩して返すことがよくあります。JSON.parse はこれらをすべて拒否します。このツールは、テキストの中からJSONを見つけ、修正方法が一つに決まる問題だけを直し、変更点をすべて一覧にするので、内容を自分で判断できます。出力が途中で切れている場合は、開いたままの部分を閉じたうえで、データが欠けている可能性があると警告します。推測はしません。直せない入力は、勝手に書き換えずに位置を示して知らせます。

こんな時に使う

  • モデルの返答を JSON.parse や設定ファイルに渡す前に直す
  • JSONの前後にコードフェンスや説明文がついた返答を整える
  • 何が変わったかを確認し、修復された値が気づかないまま本番に入り込むのを防ぐ

使い方

  1. モデルの返答を貼り付けるか、例を読み込みます。
  2. 修復後のJSONと、その下に出る変更点の一覧を確認します。
  3. 結果をコピーします。琥珀色で示された変更は情報が失われる可能性があるため、確認してください。

有効なJSONとは

  • 文字列とメンバー名には、ダブルクォートだけを使います。シングルクォートは文法に含まれていません。
  • コメントはありません。許されている余白は空白文字だけです。
  • カンマはメンバーや要素の間にだけ置くので、末尾のカンマは許されません。
  • 値は、オブジェクト、配列、数値、文字列のいずれか、または false、null、true のどれかです。Infinity、NaN、undefined はJSONの値ではありません。
  • 数値は、先頭にゼロや + を付けられず、小数点の両側に数字が必要です。そのため、012、+5、.5、5. はすべて無効です。
  • 文字列の中の U+0000 から U+001F の制御文字はエスケープしなければならず、文字列の中の生の改行は無効です。
  • 最上位には、オブジェクトや配列だけでなく、どんな値でも置けます。

モデルの出力がよく壊れるパターン

問題例このツールの処理
コードフェンスと前置きSure! ```json { … } ``` Hope this helpsJSONの部分だけを取り出します
末尾のカンマ[1, 2,]カンマを削除します
コメント{"a": 1 // note}コメントを削除します
シングルクォート{'a': 'b'}ダブルクォートにします
引用符のないキー{a: 1}キーを引用符で囲みます
Pythonの値{"ok": True, "x": None}true と null に書き換えます
文字列内の生の改行"line one⏎line two"\n にエスケープします
NaN や undefined{"x": NaN}null を書き込み、値が失われたと警告します
途中で切れた返答{"items": [{"id": 1}, {"id":開いたままの部分を閉じ、データが欠けている可能性を警告します

安全に直せるものと、そうでないもの

壊れたテキストの読み方が一つしか考えられないとき、その修復は安全です。末尾のカンマ、コメント、コードフェンスは、データが表す内容を変えずに取り除けます。それ以外の変更は意味が変わってしまうため、印を付けて表示します。確認してください。途中で切れた返答を閉じると、データの欠けた有効なJSONになり、NaN を null にすると元の値が失われます。

JSON自体に由来する制約が二つあります。RFC 8259 は、オブジェクト内の名前は一意であるべきで、そうでない場合のソフトウェアの動作は予測できないと述べています。このツールは JSON.parse と同じく、最後のものを残します。また同RFCは、IEEE 754 の倍精度浮動小数点数を超える範囲や精度を期待しないソフトウェアのほうが、相互運用性が高いと述べています。このツールは数値を書かれたまま保ちますが、非常に長い整数を倍精度浮動小数点数として解析するプログラムでは、丸められます。-(2^53)+1 から (2^53)-1 までの整数なら、正確に表せます。

より良い方法: APIに構造化出力を求める

修復は、あくまで最後の手段です。モデルのAPIでは、出力をスキーマに従わせることができ、3つのベンダーはそれぞれ違う形で文書化しています。

  • OpenAI: Structured Outputs は、モデルにJSON Schemaに従った応答を生成させます。一方、JSON mode が保証するのは有効なJSONであることだけです。拒否の応答はスキーマに従わないことがあり、最大トークン数に達した応答は不完全です(ステータスは incomplete、理由は max_output_tokens)。
  • Anthropic: 構造化出力は制約付きデコードを使って、応答をスキーマに従わせます。ドキュメントによると、これが成り立つのはほとんどの場合です。拒否(stop_reason が refusal)や、max_tokens で途切れた返答は、スキーマに一致しないことがあるため、解析する前に stop_reason を確認してください。
  • Google Gemini: モデルは、指定したスキーマに従ったJSONを生成するよう設定されます。意味的な正しさは保証されないため、値は検証してください。また、minLength や maxLength など、強制されない制約もあります。

出力が途中で切れた場合に、有効なJSONを約束している文書は3社のどれにもありません。解析した結果を信用する前に、モデルがなぜ止まったのかを確認してください。

出典(2026-10-23 確認): RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format / OpenAI: Structured Outputs / Anthropic: Structured outputs / Google AI for Developers: Structured output

FAQ

何を直せますか?

コードフェンスとJSONの前後の文章を取り除きます。末尾のカンマと // や /* */ のコメントを削除し、シングルクォートやカーリークォートをダブルクォートに直し、引用符のないキーを引用符で囲みます。True、False、None は true、false、null に変換し、行の間で抜けているカンマを補い、文字列の中の生の改行をエスケープします。+5、.5、0x1F のような数値は、有効なJSONの数値に書き直します。

絶対に変えないものは何ですか?

値です。文字列は1文字ずつそのまま残し、数値も桁をそのまま保つため、12345678901234567890 のような長いIDが丸められることはありません。キーが重複している場合は JSON.parse と同じく、最後のものが採用されます。

返答が途中で切れていたらどうなりますか?

開いたままの文字列・配列・オブジェクトを閉じ、まだ値のないキーは取り除きます。これでテキストは有効になりますが、完全ではありません。そのため、結果にはデータが欠けている可能性があると表示されます。切れた結果を信用するのではなく、モデルに続きを書かせるか、出力の上限を引き上げてください。

NaN や undefined が null になったのはなぜですか?

JSONには NaN、Infinity、undefined がないためです。このツールは代わりに null を書き込み、元の値が失われるので印を付けます。

入力によっては修復を断るのはなぜですか?

省略した項目の代わりに省略記号(...)が置かれている場合や、値があるべき場所に裸の単語がある場合のように、明らかな直し方が一つに決まらないときは、推測せずに止まって、その位置を示します。

テキストはサーバーに送られますか?

いいえ。修復はブラウザの中で行われます。

Related