JSON フォーマット & バリデーション: 完全な開発者ガイド

· 12分で読めます

目次

JSON (JavaScript Object Notation) は、Web 上でのデータ交換の事実上の標準となっています。REST API の構築、アプリケーションの設定、構造化データの保存など、JSON のフォーマットとバリデーションを理解することは、現代の開発に不可欠です。

この包括的なガイドでは、基本的な構文ルールから高度なバリデーション技術、セキュリティの考慮事項、さまざまなプログラミング言語と環境における実用的なツールまで、すべてをカバーしています。

JSON 構文ルール

JSON は、人間が読みやすく、機械が解析可能な、軽量なテキストベースのデータ交換フォーマットです。その名前は JavaScript との関連を示唆していますが、JSON は完全に言語に依存せず、事実上すべての最新のプログラミング言語でサポートされています。

このフォーマットは元々 Douglas Crockford によって仕様化され、現在は RFC 8259 で定義されています。そのシンプルさと普遍性により、API、設定ファイル、NoSQL データベース、データストレージシステムにおいて世界中で好まれる選択肢となっています。

コアデータ型

JSON は正確に6つのデータ型をサポートしており、それぞれに特定のフォーマット要件があります:

注意事項
文字列 "hello world" ダブルクォートを使用する必要があり、Unicode エスケープシーケンスをサポート
数値 42, 3.14, -1, 2.5e10 先頭のゼロなし、16進数なし、科学的記数法をサポート
真偽値 true, false 小文字のみ、クォートなし
Null null 小文字のみ、値の欠如を表す
オブジェクト {"key": "value"} 順序なしのコレクション、キーは文字列である必要がある
配列 [1, 2, 3] 順序付きリスト、混合型を含むことができる

プロのヒント: 当社の JSON フォーマッター を使用して、構文ハイライトとエラー検出により、JSON を即座に検証して整形できます。

文字列エスケープルール

JSON 文字列では、特殊文字の適切なエスケープが必要です。以下は必須のエスケープシーケンスです:

エスケープ文字を含む例:

{
  "message": "Line 1\nLine 2",
  "path": "C:\\Users\\Documents",
  "quote": "He said \"Hello\"",
  "emoji": "\u2764\uFE0F"
}

数値フォーマット仕様

JSON の数値は、一部のプログラミング言語とは異なる厳格なフォーマットルールに従います:

よくある JSON エラーと修正方法

経験豊富な開発者でも JSON 構文のミスをします。最も一般的なエラーを理解することで、より速くデバッグし、最初から有効な JSON を書くことができます。

エラー 無効な例 有効な例 説明
末尾のカンマ {"a": 1,} {"a": 1} JSON ではオブジェクトや配列の末尾のカンマは許可されません
シングルクォート {'a': 'b'} {"a": "b"} 文字列とキーにはダブルクォートのみが有効です
クォートなしのキー {name: "John"} {"name": "John"} オブジェクトのキーは常にクォートで囲まれた文字列である必要があります
コメント {"a": 1} // comment 許可されません JSON 仕様はコメントをサポートしていません
裸の値 hello "hello" トップレベルの値はオブジェクト、配列、またはクォートで囲まれた文字列である必要があります
Undefined {"a": undefined} {"a": null} undefined の代わりに null を使用
クォートの欠落 {"date": 2024-01-01} {"date": "2024-01-01"} 数値以外の値にはクォートが必要です

クイックヒント: 当社の JSON バリデーター を使用して、問題が発生している正確な場所を示す詳細なエラーメッセージでこれらのエラーを即座にキャッチできます。

パースエラーのデバッグ

JSON のパースが失敗すると、エラーメッセージは多くの場合、文字位置を指し示します。一般的なエラーメッセージの解釈方法は次のとおりです:

最新のバリデーターのほとんどは、エラーが発生した正確な行と列を表示するため、手動検査よりもはるかに高速にデバッグできます。

フォーマットと整形出力

最小化された JSON はコンパクトでデータ転送に効率的ですが、人間が読むことはほぼ不可能です。整形出力は、構造を明確でナビゲート可能にするために空白を追加します。

最小化 vs 整形出力

両方のフォーマットで同じデータを示します:

// 最小化 (1行、68バイト)
{"name":"John","age":30,"city":"New York","skills":["JavaScript","Python"]}
// 2スペースインデントで整形出力 (6行、108バイト)
{
  "name": "John",
  "age": 30,
  "city": "New York",
  "skills": ["JavaScript", "Python"]
}

最小化バージョンは40バイト (37%削減) を節約しますが、すべての可読性を犠牲にします。本番 API では、最小化された JSON は帯域幅を削減し、パフォーマンスを向上させます。開発、設定ファイル、デバッグには、整形出力された JSON が不可欠です。

インデントスタイル

異なるコミュニティには、インデントに対する異なる好みがあります:

重要なのは、プロジェクト内での一貫性です。ほとんどのチームは、リンティングツールとエディタ設定を通じてこれを強制します。

プロのヒント: 保存時に JSON をフォーマットするようにエディタを設定します。VS Code ユーザーは、設定に "editor.formatOnSave": true を追加し、JSON フォーマッター拡張機能をインストールできます。

オブジェクトキーのソート

JSON オブジェクトは技術的には順序なしですが、キーをアルファベット順にソートすると、可読性が向上し、バージョン管理での差分がよりクリーンになります:

// ソートなし
{
  "version": "1.0",
  "name": "myapp",
  "author": "John Doe",
  "dependencies": {}
}

// アルファベット順にソート
{
  "author": "John Doe",
  "dependencies": {},
  "name": "myapp",
  "version": "1.0"
}

多くの JSON フォーマッターは、オプションとして自動キーソートを提供しています。これは、複数の開発者によって頻繁に編集される設定ファイルに特に便利です。

JSONPath クエリ

JSONPath は、JSON ドキュメントからデータを抽出するためのクエリ言語を提供します。これは、XPath が XML に対して機能するのと同様です。複雑なネストされた構造を扱う場合や、特定の値をプログラムで抽出する必要がある場合に非常に貴重です。

基本的な JSONPath 構文

JSONPath 式は、ルート要素を表す $ で始まり、その後に子演算子とフィルターが続きます:

意味 結果例
$ ルート要素 ドキュメント全体
$.store.book ストア内のすべての本 本オブジェクトの配列
$.store.book[0] 最初の本 単一の本オブジェクト
$.store.book[-1] 最後の本 単一の本オブジェクト
$.store.book[0,2] 最初と3番目の本 2冊の本を含む配列
$.store.book[0:2] 最初の2冊の本 (スライス) 2冊の本を含む配列
$.store.book[*].title すべての本のタイトル 文字列の配列
$..price すべての価格 (再帰的) 数値の配列
$.store.book[?(@.price<10)] 10ドル未満の本 フィルタリングされた配列
$.store.book[?(@.category=='fiction')] フィクションの本 フィルタリングされた配列

クイックヒント: 当社の JSONPath ファインダー ツールで JSONPath クエリをインタラクティブにテストして、リアルタイムで結果を確認できます。

高度なフィルタリング

JSONPath は、比較演算子と論理条件を使用した複雑なフィルター式をサポートしています:

複数の条件を持つ例:

// フィクションで15ドル未満の本を検索
$.store.book[?(@.category=='fiction' && @.price<15)]

// 特定の著者による本を検索
$.store.book[?(@.author=='Tolkien' || @.author=='Rowling')]

// ISBN を持つ本を検索
$.store.book[?(@.isbn)]

実用的なユースケース

JSONPath は、いくつかの実世界のシナリオで優れています:

JSON スキーマバリデーション

JSON スキーマは、JSON ドキュメントに注釈を付けて検証できる語彙です。JSON データの契約を提供し、特定の構造と型の要件を満たすことを保証します。

JSON スキーマを使用する理由

スキーマバリデーションは、いくつかの重要な利点を提供します:

基本的なスキーマの例

ユーザーオブジェクトを定義する簡単なスキーマは次のとおりです:

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100
    },
    "email": {
      "type": "string",
      "format": "email"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "maximum": 150
    },
    "roles": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": ["admin", "user", "guest"]
      },
      "minItems": 1,
      "uniqueItems": true
    }
  },
  "required": ["name", "email"],
  "additionalProperties": false
}

このスキーマは、有効なユーザーオブジェクトが名前とメールを持つ必要があり、特定の制約を満たすオプションの年齢とロールフィールドを持つことを強制します。

一般的なスキーマ