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を活用してレスポンスの内容を生で確認するのが、原因特定への最短ルートです。

コメント