「JSON Parse error: Unexpected EOF」の原因と対処法

APIを呼び出したり、JSONファイルを読み込んだりしているときに突然「JSON Parse error: Unexpected EOF」が出て処理が止まってしまった——そんな経験をしたことがある開発者は多いはずです。
「EOF」という言葉が引っかかってよくわからない、という方もいると思います。
この記事では、このエラーの意味・原因・具体的な対処法を順を追って解説します。


スポンサーリンク

エラーメッセージの意味

「JSON Parse error: Unexpected EOF」を日本語に訳すと、「JSONのパース中に予期しないEOFが発生した」という意味です。

EOF(End of File) とは「ファイルの終端」のことで、プログラムがデータを読み込んでいる途中でデータが尽きたことを示します。

JSONパーサーは、入力されたテキストを先頭から順番に読み込み、JSONとして正しい構造が完結したところで処理を終えます。
ところが、構造がまだ閉じていないのに入力が終わってしまうと「なぜここで終わるんだ?」とパーサーが混乱し、このエラーを投げます。

つまり、このエラーが意味するのは「JSONデータが途中で切れている」ということです。


よくある原因

原因1:JSONの構造が閉じていない

最も典型的な原因のひとつが、括弧やダブルクォートの閉じ忘れです。
JSONはオブジェクト {} や配列 [] の開きと閉じが必ず対応していなければなりません。

以下はエラーになる例です。

{
  "name": "Taro",
  "age": 30

} が欠けているため、パーサーは閉じ括弧を待ち続けたままファイルの終わりを迎え、エラーになります。

文字列も同様で、ダブルクォートが閉じていないと同じエラーが発生します。

{
  "message": "hello
}

原因2:レスポンスが空(空文字列・空ボディ)

JSON.parse("")JSON.parse(null) のように、空文字列や空データに対してパースを実行すると「Unexpected EOF」が発生します。
APIから空レスポンス(HTTPステータス 204 No Content など)が返ってきたときに、そのままパースしようとするケースが該当します。

JavaScriptでの例:

JSON.parse('');
// SyntaxError: Unexpected end of JSON input

原因3:ネットワーク通信の途中切断

通信が不安定だったりサーバーが処理途中でクラッシュしたりすると、JSONの送信が途中で止まることがあります。
受信側は「データの一部」しか受け取っていないため、それをパースしようとするとEOFエラーになります。

具体的に起きやすいシチュエーションとして以下が挙げられます。

  • Wi-Fiが不安定な状態でのAPIアクセス
  • サーバーがタイムアウトやクラッシュで接続を切断した
  • ロードバランサーやプロキシがコネクションをタイムアウトで強制切断した

原因4:サーバーがJSONではないデータを返している

エラーページやHTMLが返ってきているのに、コードがそれをJSONとしてパースしようとしているケースです。
たとえば、APIが内部エラーを起こしてHTMLのエラーページ(<html>...)を返しているのに、フロントエンドが response.json() を呼び出しているような状況です。


対処法

対処法1:JSONの構文を検証する

JSONが手書きやテンプレート生成の場合、まず構文が正しいかを確認します。
JSONLint などのオンラインバリデーターにJSONを貼り付けるだけで、どこに問題があるかを指摘してくれます。

チェックポイントは以下の通りです。

  • {} の数が一致しているか
  • [] の数が一致しているか
  • 文字列のダブルクォートが閉じているか
  • キー名もダブルクォートで囲まれているか
  • 末尾にカンマがついていないか(JSONはトレイリングカンマを許容しない)

対処法2:レスポンスの内容を確認してからパースする

APIレスポンスを受け取る際は、パース前に内容を確認するコードを挟むのが安全です。

JavaScriptでの例:

fetch('/api/data')
  .then(response => response.text())  // まずテキストとして取得
  .then(text => {
    console.log(text);  // 中身をログに出して確認
    return JSON.parse(text);
  })
  .catch(error => console.error(error));

response.json() の代わりに一度 response.text() で受け取り、内容をログに出してから JSON.parse() をかけると、何が返ってきているかを確認できます。

また、ステータスコードを確認してから処理を分岐させるのもよい方法です。

fetch('/api/data')
  .then(response => {
    if (!response.ok || response.status === 204) {
      return null;  // 空レスポンスはパースしない
    }
    return response.json();
  });

対処法3:try-catchでエラーをキャッチする

JSON.parse() はパース失敗時に例外を投げるため、必ず try-catch でラップしてください。

try {
  const data = JSON.parse(responseText);
} catch (e) {
  if (e instanceof SyntaxError) {
    console.error('JSONのパースに失敗しました:', e.message);
    console.error('受け取ったデータ:', responseText);
  }
}

Pythonでの例:

import json

try:
    data = json.loads(response_text)
except json.JSONDecodeError as e:
    print(f"JSONパースエラー: {e}")
    print(f"受け取ったデータ: {response_text}")

エラー発生時に responseText の中身もログに出しておくと、原因特定がずっと楽になります。

対処法4:ネットワークの状態を確認する

ブラウザの開発者ツール(F12)の「ネットワーク」タブを開いて、APIレスポンスの内容を直接確認してください。
レスポンスボディが途中で途切れていたり、HTMLエラーページが返っていたりすれば、それが原因です。

Postman や cURL を使って同じAPIを直接叩いてみると、レスポンスの生の内容を確認できます。

curl -v https://api.example.com/data

サーバー側のログも合わせて確認し、タイムアウトや例外が発生していないかを調べてください。


発生しやすい環境・フレームワーク別のメモ

React Native での発生:
React Nativeのfetch APIとパースの組み合わせでEOFエラーが出ることがあります。
レスポンスが空のときや、非JSONコンテンツが返ってきたときに発生することが多いです。
response.json() の前に response.text() で内容を確認する方法が有効です。

WordPress / WP AJAX での発生:
WP AJAXハンドラーで wp_die() を忘れると、余分なHTMLが末尾に付いてJSONが壊れることがあります。
ハンドラーの末尾で必ず wp_send_json_success() または wp_die() を呼び出してください。

Python での発生:
json.loads('') や、HTTPレスポンスが空の場合に json.loads(response.text) を呼び出すと JSONDecodeError: Expecting value が発生します。
パース前に response.text が空でないことを確認する処理を入れてください。


まとめ

「JSON Parse error: Unexpected EOF」は、JSONのデータが構造として完結する前にデータが終わってしまったことを示すエラーです。
原因は大きく4つに分けられます。括弧・クォートの閉じ忘れ、空レスポンスへのパース試行、ネットワーク途中切断、そしてサーバーが非JSONデータを返しているケースです。

対処の基本は「パース前にデータの中身を確認すること」と「try-catchで例外を適切に処理すること」です。
ブラウザの開発者ツールやPostmanを活用してレスポンスの内容を生で確認するのが、原因特定への最短ルートです。

コメント

タイトルとURLをコピーしました