JSON Schema とは?使い方、例、完全チュートリアル(2026)
API レスポンスや設定ファイルを扱う際、JSON 構文が正しいからといってデータが「有効」とは限りません——フィールド欠落、型エラー、値の範囲外は、しばしばランタイムまで表面化しません。JSON Schema はまさにこの問題を解決するために生まれた規格です。本文では定義と使用シーンから出発し、基本書き方、よく使うキーワード、実践検証フロー、ツール選定まで段階的に解説し、実用的な JSON データ制約方式を構築する手助けをします。
読む前の概要
| 項目 | 説明 |
|---|---|
| コア課題 | JSON 構文は正しいが、構造や値が業務約定に合致しない |
| 解決アプローチ | Schema でフィールド型、必須項目、制約を宣言し、自動検証 |
| 推奨バージョン | Draft 2020-12(エコシステムサポートが最も成熟) |
| 本文カバー範囲 | 定義 → 書き方 → キーワード → 実践 → 選定 → FAQ |
JSON Schema とは?
JSON Schema は JSON ベースの規格で、「JSON データが満たすべき条件」を記述します。データの型宣言 + 制約ルールと理解できます:どのフィールドが必須か、各フィールドの型、文字列長や数値範囲、配列要素が満たすべき構造——すべて Schema に記述できます。
それ自体も有効な JSON ドキュメントですが、セマンティクスが異なります——Schema は業務データを載せず、業務データの形状を記述します。OpenAPI 3.x は JSON Schema でリクエスト/レスポンスボディを記述;多くの CLI ツールは Schema で設定ファイルを検証;フロントエンドフォームライブラリも Schema 駆動検証ロジックをよく使います。習得後、フロントエンド、バックエンド、CI パイプラインで同一制約定義を再利用し、「各クライアントが独自検証を書く」重複労働を削減できます。
なぜ JSON Schema が必要?
日常開発では、JSON.parse() は括弧の対応、引用符の正しさしか教えてくれません。以下の状況では構文検証は完全に無力です:
- インターフェースが
emailフィールドを要求するが、レスポンスに欠落 ageは整数のはずが、クライアントが文字列"25"を送信- 列挙フィールド
statusに約定外の値"unknown"が出現 - ネストオブジェクト
address.zipが郵便番号形式に合致しない
JSON Schema の価値は:上記の「暗黙の約束」を実行可能、共有可能、バージョン管理可能な宣言に変えること。チームは Code Review 段階で Schema と照合してインターフェース変更を確認でき、連携調整や本番後までフィールド不一致に気づかない状況を避けられます。
JSON Schema 基本的な使い方と例
最もシンプルな Schema は $schema(使用する規格バージョン)とルートレベル type を宣言する必要があります。以下はユーザーオブジェクトを記述:name 必須文字列、age 任意非負整数。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/schemas/user.json",
"title": "User",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "ユーザー氏名"
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 150
},
"email": {
"type": "string",
"format": "email"
}
},
"required": ["name"],
"additionalProperties": false
}
対応する有効なデータインスタンス:
{ "name": "田中", "age": 28, "email": "tanaka@example.com" }
{ "age": 28 }(必須 name 欠落)、または { "name": "山田", "extra": true }(additionalProperties: false で追加フィールド禁止)を渡すと、検証器は明確なエラーパスと原因を返します。
よく使うキーワード早見表
Draft 2020-12 で開発者が最も頻繁に使うキーワードは以下。Schema 記述時にほぼ必ず使います:
| キーワード | 役割 | サンプル |
|---|---|---|
| type | データ型を宣言 | "string" / "integer" / "object" |
| properties | オブジェクトのフィールド定義 | { "id": { "type": "integer" } } |
| required | 必須フィールド一覧 | ["id", "name"] |
| enum | 列挙値を限定 | ["draft", "published"] |
| format | 一般的な文字列形式 | "email" / "date-time" |
| $ref | 他 Schema フラグメントを参照 | "#/$defs/Address" |
複雑な Schema は $defs で再利用可能フラグメント(Address、Pagination など)に分割し、$ref で参照することを推奨。単一ファイルの肥大化を避けられます。
JSON Schema と JSON 構文検証の違い
両者は異なるレイヤーの問題を解決し、実践では通常組み合わせて使用します:
- 構文検証:括弧、引用符、カンマが有効か →
JSON.parse可能か - Schema 検証:フィールド、型、制約が約定に合致するか → 業務ルールを通過するか
推奨ワークフロー:まず生テキストを JSONSort に貼り付けてフォーマットと構文チェック。問題なければ ajv、fastjsonschema などのライブラリで Schema 検証。ローカルツールが構文層、Schema が意味層——役割分担が明確です。
実践:API 契約検証フロー
典型的な REST プロジェクトを例に、完全フローを 4 ステップに分解できます:
- Schema 定義:リポジトリで
schemas/user.jsonを保守し、OpenAPI または API ドキュメントとバージョン同期。 - サンプル記述:有効と不正の各 1 件を提供し、単体テスト fixture として使用。
- CI 統合:PR パイプラインで Mock レスポンスと Schema の一致を検証し、フィールドの意図しない削除・改名を防止。
- ランタイムフォールバック:サーバー側でリクエストボディ受信時に Schema 検証を実行し、400 と構造化エラーを返し、不正データの DB 書き込みを防ぐ。
このフローの核心メリットは変更の可視化:インターフェースフィールド変更が CI 段階で捕捉され、人的記憶や連携時の偶然発見に依存しません。
JSON Schema と他方式の比較
| 方式 | 長所 | 限界 |
|---|---|---|
| JSON Schema | 言語非依存、OpenAPI ネイティブサポート、成熟エコシステム | 複雑ルールの表現力に限界、学習曲線あり |
| TypeScript 型 | IDE 体験良好、コンパイル時チェック | TS エコシステム限定、ランタイムは追加変換が必要 |
| 手書き if/else 検証 | 柔軟、追加依存なし | 保守困難、再利用困難、境界ケース漏れやすい |
| Protobuf / Avro | 強型、高性能シリアライズ | コンパイルステップ必要、純 JSON API シーンに不向き |
API が既に JSON + OpenAPI なら、JSON Schema は通常最低摩擦の選択;フルスタック TypeScript で言語横断契約不要なら、TS 主体、Schema 補助が可能です。
JSON Schema に投資する価値は?
投資を推奨するシーン:
- 外部 API 提供。呼び出し元と機械可読契約を共有する必要がある
- 設定ファイル構造が複雑。デプロイ前に形式エラーを阻止したい
- 複数クライアント(Web / モバイル / バックエンド)で同一データ制約を共有
- CI でインターフェース breaking change を自動検出する必要がある
延期可能なシーン:
- たまに JSON をフォーマット・閲覧するだけ → JSONSort で十分
- データ構造が極めてシンプルで長期不変 → 手書き検証の方がコスト低
- チームに OpenAPI / 契約テストフローなし → まずドキュメント習慣を確立してから Schema 導入
よくある質問(FAQ)
JSON Schema とは?
JSON Schema は JSON データ構造と制約を記述するルール集です。それ自体が JSON ドキュメントで、フィールド型、必須項目、値範囲などを宣言し、検証器がデータ合法性を自動判定します。
JSON Schema と JSON の違いは?
JSON は業務データを載せる;JSON Schema はそのデータがどうあるべきかを記述。比喩:JSON は「インスタンス」、Schema は「金型」。
どのバージョンを選ぶべき?
新規プロジェクトは Draft 2020-12 を優先。旧プロジェクトが Draft-07 / 2019-09 使用中なら、新バージョンキーワード依存でなければ強制移行不要。
ローカルでどう検証する?
構文層は JSONSort でフォーマットとチェック;Schema 層は ajv(Node.js)、jsonschema(Python)、VS Code JSON Schema プラグイン。
OpenAPI と JSON Schema の関係は?
OpenAPI 3.x のリクエスト/レスポンスボディ定義は JSON Schema のサブセットをベースに拡張。OpenAPI ドキュメントを書くことは本質的に Schema を書くこと。
結論
JSON Schema が解決するのは「JSON が解析できるか」ではなく「データがチーム約定に合致するか」。定義、書き方から CI 統合まで、その価値は暗黙ルールを明示的・実行可能な契約に変えること。小さなインターフェースや設定ファイルから最初の Schema を書き検証を組み込み、段階的に全プロジェクトへ拡張することを推奨します。
関連記事
- JSON Schema 公式規格 権威あるキーワードとバージョン説明
- JSONSort ローカル JSON ツールボックス フォーマット、構文検証、Diff — ブラウザローカル実行
- ブログ全記事 より多くの JSON 開発チュートリアルと実践経験
更新ログ: 初稿公開