JSONデータのフォーマット検証とよくあるパースエラーの解決法
開発

JSONデータのフォーマット検証とよくあるパースエラーの解決法

SyntaxError: Unexpected tokenに悩んでいませんか?末尾カンマ・シングルクォート使用・undefinedの混入などJSONのパースエラーはパターンが決まっています。原因別の解決法とバリデーション手順を解説します。

JSONとは:データ交換フォーマットの基礎知識

JSON(JavaScript Object Notation)は、Web開発で最も広く使われているデータ交換フォーマットです。APIのレスポンス、設定ファイル、データベースのエクスポートなど、あらゆる場面で登場します。

JSONの基本構造

JSONは以下の2つのデータ構造で構成されます:

  1. オブジェクト: {key: value} の形式
  2. 配列: [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で使用不可}

解決法

undefinednull に置き換えるか、そのプロパティ自体を削除します。

{  "name": "田中太郎",  "email": null}

または

{  "name": "田中太郎"}

同様に、NaNInfinity も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では:

  1. 2つのファイルを選択
  2. 右クリック → "Compare Selected"

これで、どこが異なるかがハイライト表示されます。

JSONとJavaScriptオブジェクトの違い

JSONとJavaScriptオブジェクトは似ていますが、厳密には異なります。

項目JSONJavaScriptオブジェクト
キーのクォート必須(ダブルのみ)省略可能
値のクォートダブルのみシングルも可
末尾カンマ不可可(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フォーマッターツールも活用して、効率的にデバッグを進めてください。

関連記事