コレクションのJSONスキーマでminItems/maxItemsを使う
コレクションのJSONスキーマの信頼性を高めるには、minItems と maxItems を使いましょう。そうすればAPIを信頼できるようになります。
{
"type": "array",
"minItems": 1,
"items": {
"$ref": "subscription_notification.json"
}
}
以下の代わりに
{
"type": "array",
"items": {
"$ref": "subscription_notification.json"
}
}
APIが [] 空配列を返す場合、スペックでアサーションをすると後者はパスしてしまいます。
expect(response).to match_response_schema(:subscription_notifications)
しかし前者はパスしません
The property '#/' did not contain a minimum number of items 1 in schema
<https://json-schema.org/understanding-json-schema/reference/array.html>
JSONスキーマの配列を理解する
JSONスキーマの配列は、JSONデータにおける配列の構造と制約を定義するために欠かせません。JSONにおける配列は値の順序付きコレクションであり、JSONスキーマの配列はこれらの配列の特性と制限を指定するために使われます。JSONスキーマの配列を使えば、配列の長さ、内容、一意性をバリデーションし、データが期待される形式に従っていることを保証できます。これは、一定数のアイテムを必須にしたり、すべてのアイテムが特定の型であることを保証したりと、データ構造に特定のルールを強制したい場合に特に役立ちます。
配列のバリデーションキーワード
JSONスキーマには、配列を制約するためのバリデーションキーワードがいくつか用意されています。以下のようなキーワードがあります。
- items:配列の各アイテムのスキーマを指定します。
- additionalItems:最初の items スキーマを超える追加アイテムのスキーマを指定します。
- minItems と maxItems:配列のアイテム数の最小値と最大値を指定します。
- uniqueItems:配列のアイテムが一意でなければならないかどうかを指定します。
- contains:配列の少なくとも1つのアイテムがマッチしなければならないスキーマを指定します。
- minContains と maxContains:contains スキーマにマッチしなければならないアイテム数の最小値と最大値を指定します。
これらのキーワードを使えば、配列に対して正確な制約を定義し、データが要求される基準を満たすことを保証できます。
配列の長さを制約する
JSONスキーマには配列の長さを制約する方法がいくつかあります。minItems と maxItems キーワードで配列のアイテム数の最小値と最大値を指定できます。例:{ "type": "array", "minItems": 2, "maxItems": 5 } このスキーマは、配列が少なくとも2個、最大で5個のアイテムを持たなければならないことを指定します。これらのキーワードを使えば、配列の長さが望ましい範囲に収まることを保証でき、アイテムが少なすぎたり多すぎたりする問題を防げます。
配列バリデーションのベストプラクティス
JSONスキーマで配列をバリデーションする際は、複数のバリデーションキーワードを組み合わせて、配列が要求される制約を満たすようにするのがよいでしょう。たとえば、items で配列の各アイテムのスキーマを指定し、minItems と maxItems で配列のアイテム数の最小値と最大値を指定するといった具合です。
また、データの要件として必要であれば、uniqueItems キーワードを使って配列のアイテムが一意であることを保証するのもよいでしょう。これらのキーワードを組み合わせることで、配列の構造と内容を徹底的にバリデーションする堅牢なスキーマを作成できます。
ユースケースの例
JSONスキーマの配列のユースケースをいくつか紹介します。
- ユーザーIDのリストをバリデーションする:次のようなスキーマでユーザーIDのリストをバリデーションできます。
{ "type": "array",
"items": {"type": "integer"},
"minItems": 1, "maxItems": 10 }
- 商品名のリストをバリデーションする:次のようなスキーマで商品名のリストをバリデーションできます。
{ "type": "array", "items": {"type": "string"}, "minItems": 1, "maxItems": 5, "uniqueItems": true }
- 住所のリストをバリデーションする:次のようなスキーマで住所のリストをバリデーションできます。
{ "type": "array", "items": { "type": "object", "properties": { "street": {"type": "string"}, "city": {"type": "string"}, "state": {"type": "string"}, "zip": {"type": "string"} }, "required": ["street", "city", "state", "zip"] }, "minItems": 1, "maxItems": 10 }
これらの例は、さまざまな種類のデータにJSONスキーマの配列を適用し、配列が指定された制約と要件を満たすようにする方法を示しています。