API設計

JSON Schema じぇいそんすきーま

JSONバリデーションスキーマ定義REST APIOpenAPIデータ型
JSON Schemaについて教えて

簡単に言うとこんな感じ!

JSON Schemaは「このデータはこういう形じゃないとダメ!」っていうルールブックだよ。たとえば「名前は文字列で必須、年齢は0以上の整数」みたいなルールを事前に定義しておくと、送られてきたデータが正しい形かどうかを自動でチェックできるんだ!


JSON Schemaとは

JSON Schemaとは、JSON(JavaScript Object Notation)形式のデータの構造・型・制約をJSONそのもので記述するための仕様です。「このフィールドは文字列でなければならない」「この項目は必須だ」「数値は1〜100の範囲内でなければならない」といったルールをJSONで書き表し、受け取ったデータが正しい形かどうかを機械的にバリデーション(検証)できます。

Web APIのリクエスト・レスポンスの形式を定義したり、設定ファイルの書き方をチェックしたり、フォームの入力内容を検証したりと、「データの形を約束ごととして定める」場面で広く使われています。プログラマー同士の認識合わせにも、ドキュメントとしても機能する、一石二鳥の仕組みです。

API開発では特に重要で、OpenAPI(旧Swagger)という人気のAPI仕様書フォーマットがJSON Schemaをベースに採用しており、「システム発注の際に受け取るAPI仕様書」はほぼJSON Schemaの記法で書かれていると言っても過言ではありません。


JSON Schemaの主なキーワード(ルールの書き方)

JSON Schemaは、以下のようなキーワードを組み合わせてルールを定義します。

キーワード意味
typeデータの型を指定"string", "integer", "boolean" など
required必須フィールドのリスト["name", "email"]
propertiesオブジェクトの各フィールド定義名前・型・制約をネストして記述
minimum / maximum数値の最小値・最大値"minimum": 0
minLength / maxLength文字列の長さ制限"maxLength": 100
pattern正規表現による文字列パターンメールアドレス形式のチェックなど
enum許可する値のリスト["active", "inactive", "pending"]
format特定の書式指定"date", "email", "uri" など

具体的なスキーマ例

たとえば「ユーザー登録API」のリクエストボディのスキーマはこんな感じになります。

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "User",
  "type": "object",
  "required": ["name", "email", "age"],
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 50,
      "description": "ユーザーの氏名"
    },
    "email": {
      "type": "string",
      "format": "email",
      "description": "メールアドレス"
    },
    "age": {
      "type": "integer",
      "minimum": 0,
      "maximum": 150,
      "description": "年齢"
    },
    "role": {
      "type": "string",
      "enum": ["admin", "user", "guest"],
      "description": "権限"
    }
  }
}

覚え方のコツ

型・必須・範囲」の3点セットで考えると覚えやすいです。まずtypeデータ型を決め、requiredで必須項目を宣言し、minimummaxLengthなどで値の範囲を絞る——この順番でスキーマを書いていくとスッキリ整理できます。


歴史と背景

  • 2009年 — JSON Schemaの最初のドラフトがIETFに提出される。JSONの普及に伴いデータ検証の必要性が高まった
  • 2013年頃 — Draft 4がリリースされ、広く実装が普及。多くのバリデーションライブラリがこのバージョンに対応
  • 2016年 — Draft 6・7と改訂が続き、formatやキーワードの整理が進む
  • 2019年 — Draft 2019-09(旧Draft 8)から年号ベースのバージョン管理に移行。再帰的なスキーマ定義などが強化
  • 2020年Draft 2020-12がリリース。$dynamicRefの導入など柔軟性が向上。現時点での最新安定版
  • 現在 — OpenAPI 3.1がJSON Schema 2020-12に完全準拠。Swagger UI・Postman・VS Codeなど主要ツールが標準サポート

JSON SchemaとOpenAPIの関係

JSON SchemaはAPIエコシステムのど真ん中に位置しています。特にOpenAPIとの関係は切っても切り離せません。

JSON Schema データ構造の定義言語 type / properties required / enum minimum / maxLength format / pattern $ref(再利用) OpenAPI Spec API仕様書フォーマット エンドポイント定義 リクエスト/レスポンス schemas: ←ここでJSON Schema使用 認証・セキュリティ バージョン管理 活用ツール Swagger UI Postman VS Code ajv / zod 等 各種IDE補完

JSON Schema vs その他のスキーマ定義手段

比較項目JSON SchemaProtocol BuffersXML Schema (XSD)
記述形式JSON独自DSL(.proto)XML
主な用途REST API・設定ファイルgRPC・内部通信SOAP・行政系システム
人間の読みやすさ◎ 高い△ 要学習△ 冗長になりがち
バイナリ効率△ なし◎ 高効率△ なし
ツールサポート◎ 豊富○ 充実○ レガシー系に多い
OpenAPIとの親和性◎ 標準採用△ 別途変換必要✕ 非対応

関連する規格・RFC

規格・RFC番号内容
RFC 8259JSON(JavaScript Object Notation)の基本仕様
RFC 6901JSON Pointer(JSON Schema内で$ref参照パスに使われる)
RFC 6902JSON Patch(JSONデータの差分操作。スキーマと合わせて使われる)

関連用語

  • JSON — JSON Schemaが対象とするデータフォーマットそのもの
  • OpenAPI — JSON Schemaを内包するAPI仕様書フォーマット。実務でほぼセットで登場する
  • REST API — JSON Schemaで入出力を定義する代表的なAPIスタイル
  • バリデーション — スキーマに基づいてデータの正当性を検証する処理
  • GraphQL — 独自の型システムを持つAPI方式。JSON Schemaとは別のアプローチ
  • Protocol Buffers — gRPCで使われる別のスキーマ定義方式
  • YAML — OpenAPIのスキーマ定義はYAML形式で書かれることも多い
  • 型安全 — JSON Schemaが実現しようとする「型の保証」の概念