OOZOU
お問い合わせ
TIL一覧に戻る
ruby on rails

コレクションのJSONスキーマでminItems/maxItemsを使う

2020年10月13日

コレクションの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スキーマの配列を適用し、配列が指定された制約と要件を満たすようにする方法を示しています。

「ruby on rails」の関連記事

ruby on rails2022年2月10日

Punditポリシーで許可パラメータをデフォルトとアクション別に管理する

許可パラメータを管理するには、ポリシーに permitted\attributes と permitted\attributes\for\#{action} を追加します。例:

ruby on rails2022年1月31日

Turboでのフォーム送信には `requestSubmit` を使う

Turboはformのsubmitイベントをリッスンします。そのため、JSでフォームを送信するときは必ず requestSubmit を使いましょう。

ruby on rails2022年1月19日

GitHub Actions で Rubocop と ESLint にバンドルされた gem を無視させる

Rails プロジェクトでは、GitHub Actions で gem を vendor ディレクトリにインストールして、以降の実行でキャッシュできるようにすることがよくあります。

プロジェクトをお考えですか?

あなたが構築しているものについてお聞かせください。

会話を始めるhello@oozou.com
OOZOU Logo

バンコク · シンガポール · 香港

X
Facebook
Instagram
LinkedIn

サービス

  • Web開発
  • AIエージェント & 生成AI
  • モバイルアプリ開発
  • データ分析 & エンジニアリング
  • UI/UX & プロダクトデザイン
  • デジタルトランスフォーメーション

会社情報

  • 会社概要
  • 採用情報
  • ブログ
  • 事例研究
  • Today I Learned
  • お問い合わせ

その他

  • 業界
  • パートナーネットワーク
© 2026 OOZOU. 無断転載を禁じます。
プライバシーポリシー行動規範ABACポリシー