「Unexpected token」「Unexpected end of JSON input」といったエラーは、 JSONを扱っていると一度は目にするメッセージです。多くの場合、原因は ごく小さな書き間違いにあります。本記事では、発生しやすい順に 代表的な原因と直し方をまとめました。
配列やオブジェクトの最後の要素のあとに、うっかりカンマを残してしまうケースです。
{ "name": "太郎", "age": 20, }
JavaScriptのオブジェクトでは末尾カンマが許容されることがありますが、 JSONの仕様では認められていません。最後の要素のあとのカンマは削除します。
JSONの文字列やキーは、必ずダブルクォート(")で囲む必要があります。
シングルクォート(')はエラーになります。
{ 'name': '太郎' } ← エラー
{ "name": "太郎" } ← 正しい
JavaScriptのオブジェクトリテラルでは、キーをクォートなしで書けますが、 JSONでは必ずダブルクォートが必要です。
{ name: "太郎" } ← エラー
{ "name": "太郎" } ← 正しい
JSONには//や/* */のようなコメント構文がありません。
設定ファイルなどでJSON5やJSONCといった拡張形式を使っている場合、
通常のJSONパーサーでは読み込めず、コメント部分でエラーになります。
コピー&ペーストした文字列の中に、改行やタブといった制御文字が
エスケープされずに混じっていると、構文エラーになります。
文字列として改行を含めたい場合は、\nのようにエスケープします。
コロン「:」やカンマ「,」、ダブルクォート「”」のような全角記号が、 半角のつもりで紛れ込んでいることがあります。日本語環境の入力補完や 自動変換で起きやすいミスです。見た目では気づきにくいため、 エラー箇所の文字を1つずつ確認すると見つかりやすくなります。
「Unexpected end of JSON input」は、JSONの途中でデータが切れている ときに出るエラーです。APIのレスポンスをコピーする際に末尾が欠けていないか、 ファイルの保存が途中で止まっていないかを確認します。
エラーメッセージに行番号や位置が含まれている場合は、まずそこを確認します。 それでも見つからない場合は、JSONを整形(インデント)し直すと、 かっこの対応が崩れている箇所が視覚的にわかりやすくなります。
なお、JSONの構造そのものが正しいかを確認したい場合は、 JSONスキーマ を使うと、型や必須項目の過不足まで検証できます。
JSONの構文エラーは、末尾カンマ・シングルクォート・クォートなしキーの 3つだけで、実務で遭遇するケースの大半を占めます。残りは、コメント、 制御文字、全角記号、データの欠落です。エラー箇所を特定したいときは、 JSON整形ツール に貼り付けると、該当する行と列を確認できます。