SyntaxError: Unexpected end of JSON input

JSON.parse に渡した文字列が途中で終わっているときに出ます。空の応答、204、途中で切れた本文、二重に読んだ本文。原因を多い順に並べ、落ちない受け取り方まで実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES5難易度●●○○○目安8更新

渡した文字列が途中で終わっているときに出ます。

javascript
JSON.parse('');
SyntaxError: Unexpected end of JSON input
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
"" -> Unexpected end of JSON input "{\"a\":" -> Unexpected end of JSON input "[1," -> Unexpected end of JSON input "{" -> Expected property name or '}' in JSON at position 1 (line 1 column 2)

**いちばん多い原因は「本文が空だった」**です。壊れた JSON ではありません。

何が「途中で終わっている」なのか

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
null null { ok: true } { error: '本文が JSON ではありません', head: '<!DOCTYPE html>' }
javascript
const body = await res.text();
const data = await res.json(); // ← ここで落ちる

空・値の途中・要素の途中が、この文言になります。 { だけのときは別の文言です(次に何が来るべきか分かっているため)。

文言は処理系と版によって変わります。上は Node 22.22.3 のものです。

原因1: 応答の本文が空

これが大半です。 通信の相手が何も返していません。

状況 本文
204 No Content (仕様どおり)
304 Not Modified
エラーで本文を返さない実装
DELETE の応答 空のことが多い

res.json() は中で JSON.parse() を呼ぶので、空だとここで落ちます。

落ちない受け取り方

先に文字列で受けてから判断します。

javascript
const text = await res.text();
const data = text ? JSON.parse(text) : null;
javascript
JSON.parse('<!DOCTYPE html>');
SyntaxError: Unexpected token '<', "<!DOCTYPE html>" is not valid JSON

res.json() を直接呼ばず、res.text() で受けてから決めるのが確実です。 状態コードも一緒に見れば、「空が正しい場合」と「異常」を区別できます。

原因2: 本文を二度読んだ

応答の本文は一度しか読めません。二度目は空になります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
本文が空 HTML が返っている(通信を疑う) 単引用符がある(JSON では使えない) 中身を確かめる: {"a":1}

読むのは一度だけにして、文字列から組み立ててください。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
"{\"name\":\"あ" -> Unterminated string in JSON at position 10 (line 1 column 11) "{\"name\":\"あ\"" -> Expected ',' or '}' after property value in JSON at position 11 (line 1 column 12) "{\"a\":1," -> Expected double-quoted property name in JSON at position 7 (line 1 column 8) "{\"a\":1" -> Expected ',' or '}' after property value in JSON at position 6 (line 1 column 7)

この例は通信を伴うので、このページでは実行できません。形だけ示しています。

原因3: JSON ではないものが返ってきた

サーバーがエラー画面(HTML)を返していることがあります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
{"name":"あ\"い"} { name: 'あ"い' }
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
" " -> Unexpected end of JSON input "\n" -> Unexpected end of JSON input "\t" -> Unexpected end of JSON input

この場合は文言が変わります。 < で始まっていたら、 JSON の問題ではなく通信の問題です。 → SyntaxError: Unexpected token

先頭の数十文字を見れば、たいてい原因が分かります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
null -> null undefined -> SyntaxError 0 -> 0 {} -> SyntaxError

途中で欠けても、この文言とは限らない

ここは誤解しやすいところです。 欠け方によって文言が変わります。

どれも「途中で終わっている」のに、Unexpected end of JSON input は出ません。

Unexpected end of JSON input が出るのは、 値が始まる前に終わったときだけです。つまり空か、それに近い形

だからこの文言を見たら、まず「本文が空ではないか」を疑ってください。 形が崩れているなら、もっと具体的な文言が出ます。

文言の詳しさは処理系と版によります。古い版ではもっと大雑把に Unexpected end of JSON input になることがあります。

手で組み立てない

文字列を繋いで JSON を作ると、引用符と閉じ括弧を必ず間違えます。 組み立てには JSON.stringify() を使ってください。

空白だけでも同じ

改行だけの応答も「空」と同じです。 判定するときは text === '' ではなく text.trim() === '' で見てください。

文字列以外を渡すと、落ちないことがある

JSON.parse() は渡されたものを先に文字列にします。

  • null'null' は正しい JSON なのでそのまま通ります
  • 0'0' も正しい JSON。通ります
  • undefined'undefined' は JSON ではないので落ちます

JSON.parse(null)null を返すのは、いちばん気づきにくい形です。 値が取れなかったのか、本当に null だったのかが区別できません。 渡す前に、文字列かどうかを確かめてください。

似ているエラーとの違い

文言 意味
Unexpected end of JSON input 途中で終わっている(空・切れている)
Unexpected token '<' ... JSON でないものが来ている(HTML など)
Expected property name or '}' 形が違う(単引用符・末尾のカンマ)
Cannot read properties of undefined 読めてはいる。中身が想定と違う

探しかたの順序

  1. JSON.parse() に渡している文字列を、そのまま出す。 ここで大半が分かる
  2. 空なら → 応答の状態コードを見る(204 / 304 なら正しい動き)
  3. 空でないのに落ちるなら → 先頭20文字を見る(< なら通信を疑う)
  4. どれでもなければ → 本文を二度読んでいないか見る

このページの実行結果は Node 22.22.3 のものです。文言は処理系と版によって変わります。

まとめ

  • ほとんどの原因は本文が空。壊れた JSON ではない
  • 204 / 304空が正しい。状態コードを先に見る
  • res.json() を直接呼ばない。 res.text() で受けてから判断する
  • 本文は一度しか読めない。二度目は空になる
  • < で始まっていたら HTML。通信の問題
  • 組み立てには JSON.stringify() を使う

JSON そのものの決まり(何が消え、何が例外になるか)はこちらです。 → JSON.parse() と JSON.stringify()

この記事の根拠

  1. JSON.parse — ECMAScript® 2026 Language Specificationtc39.es
  2. RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Formatwww.rfc-editor.org
  3. SyntaxError: JSON.parse: bad parsing — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)