
JSONデータのフォーマット検証とよくあるパースエラーの解決法
SyntaxError: Unexpected tokenに悩んでいませんか?末尾カンマ・シングルクォート使用・undefinedの混入などJSONのパースエラーはパターンが決まっています。原因別の解決法とバリデーション手順を解説します。
JSONとは:データ交換フォーマットの基礎知識
JSON(JavaScript Object Notation)は、Web開発で最も広く使われているデータ交換フォーマットです。APIのレスポンス、設定ファイル、データベースのエクスポートなど、あらゆる場面で登場します。
JSONの基本構造
JSONは以下の2つのデータ構造で構成されます:
- オブジェクト:
{key: value}の形式 - 配列:
[value1, value2, ...]の形式
基本的なJSON例:
{ "name": "田中太郎", "age": 30, "isActive": true, "hobbies": ["読書", "旅行", "プログラミング"], "address": { "city": "東京", "postalCode": "100-0001" }}
JSONで使えるデータ型
- 文字列: ダブルクォーテーション
"text"で囲む - 数値:
123,45.67,-10など - 真偽値:
trueまたはfalse - null:
null - オブジェクト:
{} - 配列:
[]
重要: JSONでは undefined、関数、日付オブジェクトは使用できません。
よくあるパースエラー6種類とその原因
JSONをパースする際に遭遇する代表的なエラーパターンを紹介します。
エラー1: 末尾カンマ(Trailing Comma)
エラーメッセージ
SyntaxError: Unexpected token } in JSON at position 45
原因コード
{ "name": "田中太郎", "age": 30, // ← この末尾カンマがNG}
解決法
最後のプロパティの後のカンマを削除します。
{ "name": "田中太郎", "age": 30}
JavaScriptではオブジェクトリテラルで末尾カンマが許容されますが、JSONでは厳密に禁止されています。
エラー2: シングルクォーテーション使用
エラーメッセージ
SyntaxError: Unexpected token ' in JSON at position 2
原因コード
{ 'name': '田中太郎' // ← シングルクォートはNG}
解決法
すべての文字列をダブルクォーテーションに変更します。
{ "name": "田中太郎"}
JSONではキーも値も必ずダブルクォーテーションで囲む必要があります。
エラー3: undefined / NaN / Infinity の混入
エラーメッセージ
SyntaxError: Unexpected token u in JSON at position 10
原因コード
{ "name": "田中太郎", "email": undefined // ← undefinedはJSONで使用不可}
解決法
undefined は null に置き換えるか、そのプロパティ自体を削除します。
{ "name": "田中太郎", "email": null}
または
{ "name": "田中太郎"}
同様に、NaN や Infinity もJSONでは使用できません。
エラー4: コメントの記述
エラーメッセージ
SyntaxError: Unexpected token / in JSON at position 15
原因コード
{ // これはコメント ← JSONではコメント不可 "name": "田中太郎"}
解決法
コメントをすべて削除します。
{ "name": "田中太郎"}
JSONにはコメント構文がありません。コメントが必要な場合は、専用のキーを作ります。
{ "_comment": "これはユーザー情報です", "name": "田中太郎"}
エラー5: キーのクォート忘れ
エラーメッセージ
SyntaxError: Unexpected token n in JSON at position 3
原因コード
{ name: "田中太郎" // ← キーにクォートがない}
解決法
キーを必ずダブルクォーテーションで囲みます。
{ "name": "田中太郎"}
JavaScriptオブジェクトではキーのクォートが省略可能ですが、JSONでは必須です。
エラー6: 数値キーの混入
エラーメッセージ
SyntaxError: Unexpected number in JSON at position 5
原因コード
{ 123: "値" // ← キーが数値}
解決法
数値キーを文字列に変換します。
{ "123": "値"}
JSONのキーは必ず文字列である必要があります。
バリデーションの方法:ブラウザ・VS Code・オンラインツール
JSONが正しい形式かどうかを確認する方法はいくつかあります。
方法1: ブラウザのコンソールで検証
ブラウザの開発者ツール(F12)を開き、Consoleタブで以下を実行:
JSON.parse('{"name": "田中太郎", "age": 30}');
エラーが表示されなければ、JSONは正しい形式です。エラーが出た場合、どの位置で問題が起きているかが表示されます。
方法2: VS Codeの拡張機能を使用
Visual Studio Codeでは、.json ファイルを開くと自動的にシンタックスハイライトとバリデーションが有効になります。
エラーがある場合:
- 該当行に赤い波線が表示される
- 問題パネル(Ctrl+Shift+M / Cmd+Shift+M)にエラー詳細が表示される
さらに、Alt+Shift+F(Windows)または Option+Shift+F(Mac)でフォーマットすることで、インデントや改行を自動整形できます。
方法3: オンラインJSONバリデーター
ブラウザベースのJSONフォーマッターツールを使えば、インストール不要でバリデーション+整形が可能です。
主な機能:
- リアルタイムシンタックスチェック
- エラー箇所のハイライト
- 自動フォーマット(インデント整形)
- 圧縮(minify)
- ツリー表示
入力したJSONをコピペするだけで、エラーの種類と位置が即座にわかります。
方法4: Node.jsスクリプトで自動検証
CI/CDパイプラインなどでJSONファイルを自動検証したい場合は、Node.jsスクリプトを使用します。
const fs = require('fs');try { const data = fs.readFileSync('config.json', 'utf8'); JSON.parse(data); console.log('✅ JSONは正しい形式です');} catch (error) { console.error('❌ JSONパースエラー:', error.message); process.exit(1);}
このスクリプトをビルドプロセスに組み込めば、デプロイ前に自動チェックできます。
ネストが深い場合のデバッグテクニック
複雑にネストされたJSONでエラーを見つけるのは困難です。以下のテクニックで効率化できます。
テクニック1: 部分的にパース
エラー箇所を特定するために、JSONを分割してパースします。
// 全体ではなく、一部だけテストJSON.parse('{"name": "田中太郎"}'); // OKJSON.parse('{"hobbies": ["読書", "旅行",]}'); // エラー検出
テクニック2: JSONフォーマッターで整形
改行やインデントがないミニファイされたJSONは読みにくいため、まずフォーマットします。
整形前:
{"name":"田中太郎","age":30,"address":{"city":"東京","postalCode":"100-0001"}}
整形後:
{ "name": "田中太郎", "age": 30, "address": { "city": "東京", "postalCode": "100-0001" }}
視認性が上がり、エラー箇所を発見しやすくなります。
テクニック3: diff ツールで比較
正しいJSONと間違ったJSONをdiffツール(VS Codeの比較機能など)で比較すると、差分が一目瞭然です。
VS Codeでは:
- 2つのファイルを選択
- 右クリック → "Compare Selected"
これで、どこが異なるかがハイライト表示されます。
JSONとJavaScriptオブジェクトの違い
JSONとJavaScriptオブジェクトは似ていますが、厳密には異なります。
| 項目 | JSON | JavaScriptオブジェクト |
|---|---|---|
| キーのクォート | 必須(ダブルのみ) | 省略可能 |
| 値のクォート | ダブルのみ | シングルも可 |
| 末尾カンマ | 不可 | 可(ES5+) |
| コメント | 不可 | 可 |
| undefined | 不可 | 可 |
| 関数 | 不可 | 可 |
| Dateオブジェクト | 不可(文字列に変換) | 可 |
変換の注意点
JavaScriptオブジェクトをJSONに変換する際、JSON.stringify() が自動的に調整しますが、一部のデータは失われます。
const obj = { name: "田中太郎", age: 30, greet: function() { return "こんにちは"; }, // 関数は削除される undefined: undefined, // undefinedは削除される date: new Date() // ISO 8601文字列に変換される};console.log(JSON.stringify(obj));// 出力: {"name":"田中太郎","age":30,"date":"2026-05-26T00:00:00.000Z"}
API開発でのJSONバリデーション自動化
Web APIを開発する際、リクエスト・レスポンスのJSONバリデーションを自動化することで、エラーを未然に防げます。
JSONスキーマによる検証
JSONスキーマは、JSONデータの構造を定義する標準です。
スキーマ例:
{ "type": "object", "properties": { "name": { "type": "string" }, "age": { "type": "number", "minimum": 0 } }, "required": ["name", "age"]}
このスキーマに対してバリデーションを行うことで、データの整合性を保証できます。
Node.jsでの実装例(ajvライブラリ使用)
const Ajv = require('ajv');const ajv = new Ajv();const schema = { type: "object", properties: { name: { type: "string" }, age: { type: "number", minimum: 0 } }, required: ["name", "age"]};const validate = ajv.compile(schema);const data = { name: "田中太郎", age: 30 };if (validate(data)) { console.log('✅ バリデーション成功');} else { console.log('❌ バリデーション失敗:', validate.errors);}
ExpressなどのWebフレームワークでミドルウェアとして組み込めば、不正なリクエストを自動的に拒否できます。
まとめ:エラーパターンを知れば怖くない
JSONのパースエラーは、パターンさえ覚えれば簡単に解決できます。
- 末尾カンマ削除
- ダブルクォーテーション統一(シングル不可)
- undefinedをnullに変換
- コメント削除
- キーのクォート必須
日常的に使うツール:
- ブラウザコンソール(手軽に検証)
- VS Code(開発時のリアルタイムチェック)
- JSONフォーマッターツール(オンラインで即確認)
- JSONスキーマ(API開発の自動検証)
エラーメッセージの position X を見れば、どこで問題が起きているかがわかります。焦らず、1つずつ確認していきましょう。
JSONフォーマッターツールも活用して、効率的にデバッグを進めてください。
関連記事


