JSONスキーマバリデーション:JSONデータの定義と検証の完全ガイド
JSONスキーマがデータの契約としてどのように機能するかを学びましょう -- 基本型と必須フィールドからフォーマット検証、ドラフトバージョン、APIや設定ファイルの実用的なユースケースまで。
JSONスキーマとは?
JSONスキーマは、JSONドキュメントの構造、内容、制約を記述できる宣言型言語です。データの生産者と消費者の間の契約として考えてください。生産者は「常にnameという文字列とageという整数を持つオブジェクトを送信します」と宣言し、消費者は処理する前に、受信したすべてのペイロードが実際にその約束に適合しているかを検証できます。
これが重要なのは、JSON自体にはスキーマがないからです。文字列、数値、ランダムなキーを持つ深くネストされたオブジェクトなど、あらゆる有効なJSON値は完全に合法です。この自由はラピッドプロトタイピングには素晴らしいですが、2つのシステムがデータの形状について合意する必要がある瞬間に負債となります。
なぜJSONスキーマがAPIにとって重要なのか
REST APIはJSONペイロードを通じて通信し、各エンドポイントには暗黙の形状があります。JSONスキーマはその形状を明示的で機械可読にします。スキーマがあれば:
- リクエストを検証 -- ビジネスロジックに到達する前にサーバー側で、不明瞭な500エラーの代わりに明確な400エラーを返します。
- レスポンスを検証 -- 統合テストで、本番環境に到達する前に破壊的変更を検出します。
- ドキュメントを自動生成 -- Swagger/OpenAPIなどのツールはJSONスキーマを型定義の基盤として使用します。
- コードを生成 -- スキーマからTypeScript、GoのStruct、PythonのDataclassへの変換ツールが手動の型定義を排除します。
JSONスキーマの基本
すべてのJSONスキーマ自体がJSONオブジェクトです。最も単純なスキーマは空のオブジェクト{}で、あらゆる有効なJSONを受け入れます。
プリミティブ型
typeキーワードが基盤です。JSONスキーマは6つのプリミティブ型を認識します:
| 型 | JSONの例 | 備考 |
|---|---|---|
| string | "こんにちは" | テキスト値。minLength、maxLength、patternで制約可能。 |
| number | 3.14 | 小数を含む任意の数値。minimum、maximum、multipleOfを使用。 |
| integer | 42 | 整数のみ。numberと同じ制約。 |
| boolean | true | trueまたはfalseのみ。 |
| object | {"キー": "値"} | キーと値のペア。properties、required、additionalPropertiesで定義。 |
| array | [1, 2, 3] | 順序付きリスト。items、minItems、maxItems、uniqueItemsを使用。 |
| null | null | 値の不在。他の型と組み合わせることが多い。 |
プロパティと必須フィールド
propertiesキーワードはどのキーが期待されるかを定義します。requiredキーワードはそのうちどれが必須かをリストします。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"name": { "type": "string", "minLength": 1 },
"email": { "type": "string", "format": "email" },
"age": { "type": "integer", "minimum": 0 }
},
"required": ["name", "email"]
}
追加プロパティの制御
"additionalProperties": falseはスキーマを厳格にします -- リストされたキーのみが許可されます。
additionalProperties: falseをallOfなどの合成キーワードと一緒に使用すると、他のサブスキーマで定義されたプロパティが拒否される可能性があります。これはJSONスキーマで最も一般的な落とし穴の一つです。
フォーマット検証
formatキーワードは基本型を超えたセマンティック検証を提供します。
組み込みフォーマット
| フォーマット | 値の例 | ユースケース |
|---|---|---|
| date-time | 2026-03-27T10:30:00Z | イベントやログ用のISO 8601タイムスタンプ |
| date | 2026-03-27 | 時間なしのカレンダー日付 |
[email protected] | 問い合わせフォーム、ユーザー登録 | |
| uri | https://example.com/api | WebhookのURL、リソースリンク |
| uuid | 550e8400-e29b-41d4-a716-446655440000 | 一意識別子、主キー |
| ipv4 | 192.168.1.1 | ネットワーク設定、サーバーアドレス |
アノテーションとしてのフォーマット vs アサーション
デフォルトでは、formatはアサーションではなくアノテーションです。Draft 2020-12では、フォーマットアサーションを明示的に有効にする必要があります。
formatとpattern正規表現を常に組み合わせてください。
ドラフトバージョン:Draft-07 vs 2020-12
最も頻繁に遭遇する2つのバージョンはDraft-07とDraft 2020-12です。
主な違い
| 機能 | Draft-07 | Draft 2020-12 |
|---|---|---|
| prefixItems | 利用不可 | タプル検証を置き換え |
| $dynamicRef | 利用不可 | 新機能 -- 動的スキーマ参照 |
| unevaluatedProperties | 利用不可 | additionalProperties + allOfの問題を解決 |
| ライブラリサポート | 優秀 | 良好で成長中 |
どのバージョンを選ぶべきか?
Draft-07を選択 -- エコシステムが既に使用している場合、または最大限の互換性が必要な場合。
Draft 2020-12を選択 -- レガシー制約のない新しいプロジェクトを開始する場合。
結論
2026年のほとんどの新規プロジェクトでは、Draft 2020-12がより良いデフォルト選択です。
JSONスキーマジェネレーターの使い方
無料のJSONスキーマジェネレーターは、任意のJSONペイロードを受け取り、自動的に有効なスキーマを生成します。すべてブラウザ内で動作します。
ステップバイステップガイド
- JSONスキーマジェネレーターツールを開きます。
- 入力エリアにJSONを貼り付けます。
- 生成をクリックすると、ツールが各フィールドを分析し、型を推論し、フォーマットを検出します。
- 出力を確認 -- 生成されたスキーマが出力パネルに表示されます。
- 検証タブに切り替えて、新しいJSONペイロードに対してスキーマをテストします。
- ワンクリックでスキーマをコピーし、プロジェクトに統合します。
プライバシーに関する注意
JSONスキーマジェネレーターは100%ブラウザ内で動作します。JSONデータ、生成されたスキーマ、検証結果がデバイスから外部に送信されることは一切ありません。
JSONスキーマを即座に生成
任意のJSONペイロードを貼り付けて、型推論、必須フィールド、フォーマット検出を備えたすぐに使えるスキーマを取得 -- 100%ブラウザ内で処理。