タプルバリデーション — prefixItemsで位置ごとに型を指定

JSON Schemaの prefixItems(旧 items 配列形式)でタプル型の配列を定義し、各位置ごとに異なる型を検証する方法を解説します。

Array Constraints

JSON Schema

{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "point": {
      "type": "array",
      "prefixItems": [
        { "type": "number", "minimum": -180, "maximum": 180 },
        { "type": "number", "minimum": -90, "maximum": 90 }
      ],
      "items": false,
      "minItems": 2,
      "maxItems": 2
    },
    "rgb": {
      "type": "array",
      "prefixItems": [
        { "type": "integer", "minimum": 0, "maximum": 255 },
        { "type": "integer", "minimum": 0, "maximum": 255 },
        { "type": "integer", "minimum": 0, "maximum": 255 }
      ],
      "items": false
    },
    "record": {
      "type": "array",
      "prefixItems": [
        { "type": "integer" },
        { "type": "string" },
        { "type": "boolean" }
      ],
      "items": false
    }
  },
  "required": ["point"]
}

Test Data

{
  "point": [-122.4194, 37.7749],
  "rgb": [59, 130, 246],
  "record": [42, "active", true]
}

詳細な説明

JSON Schemaでは prefixItems(Draft 2020-12)または items の配列形式(Draft 4-7)を使用して、配列の各位置に異なるスキーマを適用するタプルバリデーションを実現できます。

Draft 2020-12の構文:

{
  "type": "array",
  "prefixItems": [
    { "type": "string" },
    { "type": "integer" },
    { "type": "boolean" }
  ],
  "items": false
}

このスキーマは ["hello", 42, true] のように、第1要素が文字列、第2要素が整数、第3要素がbooleanの正確に3要素の配列を要求します。items: false は追加要素を禁止します。

Draft 4-7の構文:

旧バージョンでは items を配列として使用し、additionalItems で追加要素を制御していました。新しいプロジェクトではDraft 2020-12の prefixItems を使用することが推奨されます。

ユースケース

座標ペア [x, y]、CSV行データ [名前, 年齢, メール]、API応答の固定構造タプルなどをバリデーションする際に使用します。

試してみる — JSON Schema Validator

フルツールを開く