CreaTools LogoCreaTools
JSON Formatter

JSONの構文エラーと直し方|症状から原因を特定

2025-01-03

まず、ここに貼ってください

エラーメッセージを読んでも原因がわからないなら、JSON Formatterに貼って「検証のみ」をクリック。行番号と列番号が表示され、該当行がハイライトされる。

厄介なのは、エラーメッセージが指す行と実際の原因が違う場所にあるケース。閉じ忘れや末尾カンマは、エラーが出る行より前に原因があることが多い。だからこそ、まず全体を検証ツールに通すのが早い。

以下は症状別の原因と修正方法。エラー箇所が特定できたら、該当するセクションを見てください。


症状別:エラー原因と直し方

「最後のカンマで怒られる」

{
  "a": 1,
  "b": 2,  ← ここ
}

原因: 末尾カンマ(trailing comma)

JavaScriptでは許容されるが、JSONでは禁止。最後の要素のカンマを削除する。

{
  "a": 1,
  "b": 2
}

これが一番多い。エディタの自動整形に任せていると、気づかず混入することがある。

→ 削除したらJSON Formatterで再検証。他にエラーがなければ完了。


「コメントを書いたら壊れた」

{
  // 設定値  ← ここ
  "key": "value"
}

原因: 標準JSONにコメントは存在しない

VSCodeの設定ファイルで動いていたのは、JSONC(JSON with Comments)として処理されていたから。APIに送ったり JSON.parse() に渡すと壊れる。

対処法:

  • コメントを手動で削除する
  • または JSON Formatter の「コメント除去」をONにして変換

→ 変換したら再検証。なぜJSONCが問題になるのかはJSONとJSONCの違いで解説。


「シングルクォートでエラー」

{
  'key': 'value'  ← ここ
}

原因: JSONはダブルクォートのみ

シングルクォートはJavaScriptの書き方。JSONでは使えない。

{
  "key": "value"
}

エディタの置換機能で '" を一括変換するのが早い。ただし、値の中にアポストロフィがある場合は巻き込まないよう注意。

→ 置換したらJSON Formatterで再検証。


「キーにクォートを付けなかったらエラー」

{
  key: "value"  ← ここ
}

原因: JSONではキーのクォートは必須

JavaScriptオブジェクトでは省略できるが、JSONでは必ずダブルクォートで囲む。

{
  "key": "value"
}

ブラウザのコンソールからコピペしたときに起きやすい。コンソールで動いたからといって、JSONとして有効とは限らない。

→ 修正したら再検証。JSオブジェクトとの違いはこちら


「文字列に改行を入れたらエラー」

{
  "text": "1行目
2行目"  ← ここ
}

原因: 文字列内に直接改行は入れられない

エスケープシーケンス \n を使う。

{
  "text": "1行目\n2行目"
}

同様に、タブは \t、バックスラッシュは \\

複数行のテキストをJSONに入れるときは、エディタで改行を \n に置換してから貼り付ける。

→ 修正したらJSON Formatterで再検証。


「ダブルクォートを含む文字列でエラー」

{
  "message": "He said "Hello""  ← ここ
}

原因: エスケープ漏れ

文字列内にダブルクォートを含める場合は \" でエスケープ。

{
  "message": "He said \"Hello\""
}

HTMLやSQLを含むJSONを手書きするときに起きやすい。

→ 修正したら再検証。


「数値の書き方でエラー」

{
  "price": .5,      ← 先頭ゼロ省略はダメ
  "count": 01,      ← 先頭ゼロはダメ
  "hex": 0xFF       ← 16進数はダメ
}

原因: JSONの数値は10進数のみ、省略記法は不可

{
  "price": 0.5,
  "count": 1,
  "hex": 255
}

他の言語から持ってきたデータで起きることがある。

→ 修正したら再検証。


「undefinedやNaNを入れたらエラー」

{
  "value": undefined,  ← ダメ
  "result": NaN,       ← ダメ
  "max": Infinity      ← ダメ
}

原因: JSONで使えるのは null のみ

undefinedNaNInfinity はJavaScriptの値であり、JSONには存在しない。

{
  "value": null,
  "result": null,
  "max": null
}

JSON.stringify()NaNInfinitynull に変換するが、手書きのときは自分で置き換える必要がある。

→ 修正したら再検証。JSとJSONの違いはこちら


エラーメッセージ別:原因早見表

エラーメッセージよくある原因確認箇所
Unexpected token末尾カンマ、コメント、不正な文字エラー行の直前
Unexpected end of JSON}] の閉じ忘れファイル末尾付近
Expected property nameキーのクォート忘れエラー行のキー
Expected ':'キーと値の間のコロン忘れエラー行
Expected ','要素間のカンマ忘れエラー行の直前

まとめ:修正フロー

エラーが出た
    ↓
JSON Formatterに貼って「検証のみ」
    ↓
行番号を確認
    ↓
該当セクションの修正方法を適用
    ↓
再度「検証のみ」で確認
    ↓
エラーがなくなったら完了

JSON Formatterに戻る