JSONのよくあるエラー7つと直し方
2026.10.03 更新 · 4分で読めます
JSONのパースエラーの多くは、末尾のカンマ、シングルクォート、クォートのないキー、コメント、閉じ忘れの括弧、NaN・undefined、重複キーが原因です。RFC 8259をもとに原因と直し方をまとめました。
JSON整形・検証をすぐに使うJSONのパースが失敗する原因は、ほとんど決まっています。JavaScriptのコードでは書けても、JSONの標準(RFC 8259)にはない書き方をしているためです。エラーになったJSONをJSON整形・検証に貼り付けると、何行目の何列目で何が問題なのかをすぐに確認できます。次の7つを知っておけば、ほとんどのエラーは自分で直せます。
7つのエラー早見表
| 番号 | エラー | 誤った例 | 直した例 |
|---|---|---|---|
| 1 | 末尾のカンマ | {"a":1,} |
{"a":1} |
| 2 | シングルクォート | {'a':1} |
{"a":1} |
| 3 | クォートのないキー | {a:1} |
{"a":1} |
| 4 | コメント | // x |
コメントを削除 |
| 5 | 閉じていない括弧 | {"a":[1,2} |
{"a":[1,2]} |
| 6 | NaN・Infinity・undefined | {"a":NaN} |
{"a":null} |
| 7 | 重複キー | {"a":1,"a":2} |
{"a":2} |
1〜6は文法エラーなので、パーサーはそこで読み取りをやめます。7はエラーにならずに読めますが、結果がパーサーによって変わることがあります。
文法エラー6つ
1. 末尾のカンマ
RFC 8259の文法では、カンマは要素と要素の間にしか置けません。JavaScriptやPythonのコードでは最後の要素の後ろにカンマを残せるため、手で編集したJSONによく出るエラーです。{"a":1,}を入力すると、1行 8列で「末尾のカンマはJSONでは使えません。」と表示されます。閉じ括弧の直前のカンマを消してください。配列の[1,2,]も同じです。
2. シングルクォート
JSONの文字列はダブルクォートで始まり、ダブルクォートで終わります(RFC 8259 7節)。{'a':1}は1行 2列で「文字列とキーはダブルクォート(“)で囲む必要があります。」というエラーになります。Pythonで辞書をprintした結果をそのまま貼り付けたときによく起こります。json.dumpsで出力すればダブルクォートになります。
3. クォートのないキー
オブジェクトの名前(キー)も文字列なので、ダブルクォートが必要です。JavaScriptのオブジェクトリテラル{a:1}はJSONではなく、1行 2列で「キーをダブルクォートで囲んでください。」というエラーになります。
4. コメント
JSONにコメントの文法はありません。値の間に置けるのは、スペース、タブ、改行だけです。次の入力は2行 3列で「JSONにはコメントを書けません。」というエラーになります。
{
// port
"port": 8080
}
コメントを書けるJSONCやJSON5は、JSONを拡張した別の形式です。標準のJSONパーサーでは読めません。説明はドキュメントに書くか、受け取る側が無視するキーの値として入れてください。
5. 閉じていない括弧
開き括弧と閉じ括弧は、種類と順番が合っていなければなりません。{"a":[1,2}は、[を閉じる前に}が出てきています。このツールはエラーの位置(1行 10列)とあわせて、「[(1行 6列)が閉じられていません。」のように開き括弧の位置も表示します。長いJSONが途中で切れているときも同じエラーになるので、ログやチャットからコピーしたときに末尾が欠けていないか、まず確認してください。
6. NaN・Infinity・undefined
JSONの値は、オブジェクト、配列、文字列、数値、true、false、nullの7種類だけです。RFC 8259 6節は、InfinityやNaNのように数値の文法で表せない値を認めていません。{"a":NaN}は1行 6列で「JSONの値ではありません(null または数値にしてください)。」というエラーになります。true・false・nullは小文字で書く決まりなので、PythonのTrueもエラーです。
JavaScriptのJSON.stringifyは、NaNとInfinityをnullに変え、値がundefinedのプロパティは出力しません。文字列を連結してJSONを組み立てると、こうした値がそのまま入ってしまいます。シリアライズ用の関数に任せるほうが確実です。
エラーではないが危険な重複キー
RFC 8259 4節は、オブジェクト内の名前は一意であるべきだとしています。一意でない場合の動作は予測できず、最後の値だけを返す実装が多いものの、エラーにする実装や、すべての組を返す実装もあると書かれています。JavaScriptではJSON.parse('{"a":1,"a":2}')の結果は{"a":2}です。
このツールは{"a":1,"a":2}を書かれたとおりに整形したうえで、2つ目のキーの位置(1行 8列)に「キー “a” が重複しています。多くのパーサーは最後の値だけを残します。」という警告を表示します。設定ファイルをまとめるときに同じキーが2回入ることが多いので、残す値を1つにしてください。
エラー位置の読み方
- 行と列は1から数えます。列はUnicodeのコードポイント単位です。日本語や
😀は1文字として数えますが、肌の色付きや家族の絵文字のように複数のコードポイントでできた文字は、その数だけ列が増えます。 - 表示されるのは、パーサーがそれ以上読めなくなった位置です。原因はその位置か、すぐ手前にあります。
- 表示されるエラーは最初の1つだけです。直してからもう一度確認してください。
- ブラウザの
JSON.parseのエラーメッセージは、エンジンによって異なります。このツールは独自のパーサーを使うため、どのブラウザでも同じ位置と同じメッセージになります。
まとめ
- JSONはJavaScriptのオブジェクトリテラルより狭い形式です。使えるのはダブルクォートだけで、末尾のカンマとコメントは書けません。
- 値は7種類だけです。
NaNやundefinedはnullか数値に置き換えます。 - 最上位の値はオブジェクトや配列でなくてもかまいません。
"text"や42も正しいJSONです。 - 重複キーはエラーにならなくても、1つだけ残します。
- 直したあとはJSON整形・検証でもう一度確認してください。入力はブラウザ内だけで処理されます。