タプルバリデーション — 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応答の固定構造タプルなどをバリデーションする際に使用します。