allOf — 全てのスキーマに同時に一致

JSON Schemaの allOf キーワードで、複数のスキーマの全てに同時に一致するバリデーションを定義する方法を解説します。

Composition

JSON Schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "allOf": [
    {
      "properties": {
        "id": { "type": "integer", "minimum": 1 },
        "createdAt": { "type": "string", "format": "date-time" },
        "updatedAt": { "type": "string", "format": "date-time" }
      },
      "required": ["id", "createdAt", "updatedAt"]
    },
    {
      "properties": {
        "title": { "type": "string", "minLength": 1, "maxLength": 200 },
        "content": { "type": "string", "maxLength": 50000 },
        "status": { "type": "string", "enum": ["draft", "published", "archived"] }
      },
      "required": ["title", "status"]
    }
  ]
}

Test Data

{
  "id": 42,
  "createdAt": "2025-01-15T10:30:00Z",
  "updatedAt": "2025-01-20T14:00:00Z",
  "title": "Getting Started with JSON Schema",
  "content": "JSON Schema is a powerful tool for validating JSON data...",
  "status": "published"
}

詳細な説明

JSON Schemaの allOf キーワードは、指定した全てのスキーマに値が同時に一致する必要がある論理AND条件を定義します。スキーマの合成(コンポジション)やミックスインの実現に使用されます。

基本構文:

{
  "allOf": [
    {
      "type": "object",
      "required": ["name"],
      "properties": { "name": { "type": "string" } }
    },
    {
      "type": "object",
      "required": ["age"],
      "properties": { "age": { "type": "integer" } }
    }
  ]
}

このスキーマは name(文字列)と age(整数)の両方を持つオブジェクトを要求します。

主な用途:

  • スキーマの継承: ベーススキーマに追加フィールドを拡張
  • ミックスイン: 複数のスキーマ断片を1つに合成
  • $ref との組み合わせ: 共通スキーマを参照しつつ追加制約を適用

allOf 内の各スキーマが矛盾する制約を持つ場合(例: 一方が maxLength: 5、他方が minLength: 10)、どの値も検証に成功しないスキーマになるため注意が必要です。

ユースケース

基本エンティティの拡張、共通フィールドのミックスイン、APIバージョン間のスキーマ合成などで使用します。

試してみる — JSON Schema Validator

フルツールを開く