本文へ移動
ZEKILO Dev
整形

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整形・検証でもう一度確認してください。入力はブラウザ内だけで処理されます。

この記事に関連するツール

出典と基準

ほかのガイド