JSONの「SyntaxError: Unexpected token」原因5選とデバッグ対処法
JSON エラー解決 JavaScript API
結論:30秒で Unexpected token を解決する
Unexpected token '<': API が JSON ではなく HTML(404/500)を返しているUnexpected token 'o': 既にオブジェクトの変数をJSON.parse()に渡している- 文法ミス: シングルクォート (
') / 末尾カンマ (,}) / コメント (`) は JSON 厳禁
1. エラーが発生する代表的な5つの原因
JSON の仕様(ECMA-404)は、JavaScript のオブジェクトリテラル表記よりも大幅に厳しい制約があります。
| 原因 | 発生するコード(NG) | 正しいJSON表記(OK) |
|---|---|---|
| ① 末尾カンマ (Trailing Comma) | {"id": 1, "name": "Kawa",} | {"id": 1, "name": "Kawa"} |
| ② シングルクォートの使用 | {'id': 1, 'name': 'Kawa'} | {"id": 1, "name": "Kawa"} |
| ③ キーのクォート囲み漏れ | {id: 1, name: "Kawa"} | {"id": 1, "name": "Kawa"} |
| ④ コメントの記述 | {"id": 1 // ID番号} | {"id": 1} |
| ⑤ APIがHTML(404/500)を返した | <DOCTYPE html>... | {"status": 200, "data": []} |
2. 最も多い罠:fetch で HTML レスポンスが返ってきた場合
// エラー例: SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON
const res = await fetch('/api/user/123');
const data = await res.json(); // ← ここでエラー
対処コード
res.json() を呼ぶ前に、必ず res.ok または res.status を確認します。
const res = await fetch('/api/user/123');
if (!res.ok) {
const errorText = await res.text();
console.error(`HTTP Error ${res.status}:`, errorText);
throw new Error(`API呼び出し失敗: status=${res.status}`);
}
const data = await res.json();
3. [object Object] をパースしようとしている場合
const obj = { name: "Kawa" };
JSON.parse(obj);
// SyntaxError: Unexpected token 'o', "[object Object]" is not valid JSON
JSON.parse() の引数には文字列を渡す必要があります。オブジェクトを渡すと自動的に文字列化され "[object Object]" になり、最初の文字 o で構文エラーになります。
4. オンライン構文チェック・自動修正
手元の JSON 文字列の構文エラー位置をブラウザ上で特定・自動修復できます。