fixmint
JA

パースエラーの多くを招くJSONのミスと、その直し方

著 · · 2026年11月8日更新 · 5分で読めます

JSONの解析エラーの多くは、次の短い一覧にあるミスから起きます。末尾のカンマ、シングルクォートで囲んだ文字列、コメント、引用符のないキー、NaNやundefinedといった値、文書からコピーしたスマートクォートです。JSONはJavaScriptに似ていますが、より厳格です。そのため、人にとっては正しく見えるコードでも、パーサーに拒否されることがあります。エラーメッセージは行と列を示しており、修正箇所はたいてい、その位置またはその直前にあります。

JSON整形JSONが読み込めない無料で使う

JSONが課す規則

JSONのドキュメントは一つの値です。中括弧で囲んだオブジェクト、角括弧で囲んだ配列、文字列、数値、true、false、nullのいずれかになります。その中では、次の規則が適用されます。

  • すべてのキーと文字列は、"name"のように半角のダブルクォートで囲みます。
  • 項目はカンマで区切ります。オブジェクトや配列の最後の項目の後ろにカンマを付けてはいけません。
  • 数値に先頭の+を付けることはできません。NaN、Infinity、undefinedは、有効な数値や値ではありません。
  • コメントは一切使えません。
  • キーは文字列でなければならないため、name: のように引用符のないキーは無効です。

一部のパーサーはこれらの一部をデフォルトで受け入れ、コメント付きのJSONを便利機能として受け入れるツールもあります。しかし、その寛容さは、より厳格な読み手にファイルが渡るまで問題を隠してしまいます。最初から厳密な形で書いてください。

エラーメッセージの読み方

パーサーは、先へ進めなくなった最初の箇所を報告します。メッセージには問題の内容と位置(通常は行と列)が示されます。配列の中の末尾カンマと、最後のプロパティの後のもう一つのカンマがある小さなファイルを例に示します。

{
  "name": "Ada",
  "tags": ["a", "b",],
}

Pythonでは、これは "Illegal trailing comma before end of array: line 3 column 20" と報告されます。ツールによって文言は異なり、古いパーサーは「Unexpected token」と文字のオフセットだけを表示することもあります。報告された位置に移動し、その直前の文字を確認してください。本当のミスは、示された位置より一、二文字前にあるカンマ、引用符、括弧であることがよくあります。

Pythonのパーサーが出すメッセージと、その多くの意味は次のとおりです。

  • '{'a': 1}' で "Expecting property name enclosed in double quotes" と出る場合、シングルクォートで囲んだキーか、引用符のないキーがあります。
  • 数値や文字列を期待した位置で "Expecting value" と出る場合、多くはスマートクォートが原因です。パーサーはそれを文字列の区切りではなく、未知の文字として扱います。
  • "Expecting ',' delimiter" は、二つの項目の間のカンマが抜けているか、データの途中にコメントがあることを示しています。

スマートクォートとコピーしたテキスト

スマートクォートは直線の引用符とほとんど同じに見えるため、もっとも分かりにくい例です。ワープロ、Webページ、チャットのメッセージからコピーしたJSONファイルには、カーブしたダブルクォートが含まれることがあります。見た目は正しいのに解析に失敗するのは、パーサーが“x”を文字列の区切りではなく、未知の文字として扱うからです。

隠れた文字でも、同じ種類の失敗が起きます。二つの値の間にあるノーブレークスペースは、パーサーにとって空白ではありません。手作業で構造を直す前に、見えない文字を削除してから、引用符を直してください。スマートクォートの解説記事で、安全に直す方法を説明しています。

シングルクォート、コメント、引用符のないキー

JSONに似たデータを、より多くの書き方を許す言語で書く開発者は多くいます。

  • シングルクォートは、JavaScriptやPythonのリテラルでは有効ですが、JSONでは二重引用符が必要です。{'a': 1} は {"a": 1} に置き換えてください。
  • // や /* */ のようなコメントは削除してください。メモが必要な場合は、別のフィールドに入れるか、設定ファイル向けの形式を使ってください。
  • 引用符のないキーは、JavaScriptのオブジェクトリテラルでよく見られます。引用符を付けてください。
  • NaNとundefinedはJSONではありません。値が意図的に欠けている場合はnullを、値がテキストなら文字列を使ってください。

すべてのシングルクォートを一括で二重引用符に置き換える一括置換には注意してください。"Ada's notes" のようにアポストロフィを含む文字列は壊れてしまいます。まず検索と置換で一致箇所をすべてプレビューし、どの引用符が変わるかを確認してください。

構造を一歩ずつ直す

  1. ファイルをJSON整形に貼り付けます。整形すると構造が見えやすくなり、エラーに行と列が表示されます。次に修復を押すと、コメントと末尾のカンマが削除されます。シングルクォートとスマートクォートは変わらないため、自分で直してください。
  2. 最初のエラーだけを直してから、もう一度確認してください。一つのミスが、その後ろで複数のエラーを引き起こすことがあります。
  3. すべての開き括弧と角括弧に、対応する閉じ括弧があるか、入れ子の構造が意図どおりか確認してください。
  4. 最終的なファイルは、Webツールだけでなく、アプリケーションが使うパーサーで検証してください。パーサーによって細かな違いがあります。

解析できるファイルが、必ずしも意図したファイルとは限りません。欠けているフィールドや型の違う値を見つけるには、JSON スキーマ検証ツールでファイルを検証してください。どこが変わったかを確認するには、JSON比較で二つのJSONドキュメントを比べます。

特殊なケース

  • 生成されたファイルの末尾カンマ。 一部のツールは末尾のカンマを出力します。文字列を手で組み立ててJSONを作る場合は、言語の標準のシリアライザを使ってください。有効な出力が得られます。
  • 重複するキー。 JSONでは許されていますが、ほとんどのパーサーは最後の値だけを残します。重複キーは、いずれバグになる危険があります。
  • 大きな数値。 非常に大きな整数は、一部のパーサーで精度が失われることがあります。パーサーが正確に表せる長さを超える ID は、文字列として保存してください。CSVからJSONへの変換の解説記事も、ID について同じ点を説明しています。

すぐに分かる回答

正しく見えるのに、JSONが解析できないのはなぜですか?

よくある原因は、末尾のカンマ、シングルクォート、コメント、文書からコピーしたスマートクォートです。エラーメッセージに示された位置と、その直前の文字を確認してください。

JSONにコメントを入れられますか?

いいえ。JSON標準ではコメントは許されていません。削除するか、メモを独立したフィールドに移してください。整形ツールの修復ボタンで、自動的に削除できます。

JSONでundefinedの代わりに何を使えばよいですか?

値が意図的に欠けている場合はnullを使うか、キーを丸ごと省いてください。undefinedはJavaScriptの値で、JSONでは表現できません。

英語原文をもとに、AIの支援を受けて翻訳しています。

コメント

    まだコメントはありません。最初のコメントを書いてみましょう。

    評価(任意)

    メールアドレスは表示も保存もされません。

    How to Remain Valuable When Intelligence Becomes Cheapの表紙How to Remain Valuable When Intelligence Becomes Cheap

    AIが認知作業の大半をこなせるようになっても希少であり続ける、人間ならではの強み、経済面と戦略面での優位性について解説した224ページのガイドです。

    $3.84Gumroadで入手英語版