anyOf — 複数スキーマのいずれかに一致

JSON Schemaの anyOf キーワードで、複数のスキーマのうち少なくとも1つに一致するバリデーションを定義する方法を解説します。

Composition

JSON Schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "contact": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "email": { "type": "string", "format": "email" }
          },
          "required": ["email"]
        },
        {
          "type": "object",
          "properties": {
            "phone": { "type": "string", "pattern": "^\\+[1-9]\\d{6,14}$" }
          },
          "required": ["phone"]
        }
      ]
    },
    "identifier": {
      "anyOf": [
        { "type": "string", "format": "email" },
        { "type": "string", "pattern": "^[a-zA-Z0-9_]{3,30}$" },
        { "type": "integer", "minimum": 1 }
      ]
    }
  },
  "required": ["contact"]
}

Test Data

{
  "contact": {
    "email": "alice@example.com",
    "phone": "+14155551234"
  },
  "identifier": "alice_dev"
}

詳細な説明

JSON Schemaの anyOf キーワードは、指定した複数のスキーマのうち少なくとも1つに値が一致すればバリデーションが成功する論理OR条件を定義します。

基本構文:

{
  "anyOf": [
    { "type": "string" },
    { "type": "integer" }
  ]
}

このスキーマは文字列または整数を受け入れます。

oneOf との違い:

  • anyOf: 1つ以上のスキーマに一致すればOK(複数のスキーマに同時に一致しても有効)
  • oneOf: 正確に1つのスキーマにのみ一致する必要がある

anyOfoneOf よりも寛容で、パフォーマンスも良い傾向があります。厳密な排他性が不要な場合は anyOf を優先的に使用することが推奨されます。ユニオン型やnullable型の定義によく使用されます。

ユースケース

複数の型を許容するフィールド、異なるフォーマットのデータ入力、バージョン間の互換性対応などで使用します。

試してみる — JSON Schema Validator

フルツールを開く