JSON Schemaのrequired(必須)とoptional(オプショナル)プロパティ
JSON Schemaにおける必須プロパティとオプショナルプロパティの違いを理解します。ジェネレーターがどのフィールドを必須にするかの判断基準と調整方法を学びます。
Object Schemas
詳細な説明
required と optional: ジェネレーターの判断
required キーワードはオブジェクトスキーマの最も重要な部分の一つです。データが有効であるためにどのプロパティが存在しなければならないかを制御します。
ジェネレーターの処理方法
単一のJSONサンプルを提供すると、ジェネレーターは通常、観測されたすべてのキーを required としてマークします:
{
"required": ["id", "name", "email", "role"]
}
要件を緩和するタイミング
実際には、多くのフィールドはオプショナルです。生成後、各プロパティを確認しましょう:
- このフィールドは常にクライアントから提供されるか? そうでなければ、
requiredから削除します。 - このフィールドに適切なデフォルト値があるか? サーバーが補完できるなら、必須にすべきではありません。
- このフィールドは条件付きで存在するか? 例えば、ビジネスアカウントにのみ表示される
companyフィールド。
required キーワードのセマンティクス
{
"type": "object",
"properties": {
"id": { "type": "integer" },
"name": { "type": "string" },
"nickname": { "type": "string" }
},
"required": ["id", "name"]
}
このスキーマでは、id と name が必須です。nickname は properties で定義されていますが required から省略されているため、オプショナルです。
よくある間違い
- オプショナルとnullableの混同: プロパティはオプショナル(オブジェクトに存在しない)でありながら非nullable(存在する場合は
nullであってはならない)であることができます。 - 過度な必須化: すべてのフィールドを必須にすると、後で新しいフィールドを追加する際に後方互換性が壊れます。
- 必須の不足: 重要なフィールドを
requiredから省略すると、無効なペイロードが静かに通過する可能性があります。
複数サンプルからの推論
高度なジェネレーターは複数のサンプルオブジェクトを受け入れ、キーの共通部分を計算してrequiredフィールドを決定します。すべてのサンプルに存在するキーはおそらく必須であり、一部のサンプルから欠落しているキーはおそらくオプショナルです。
ユースケース
APIコントラクトを設計する際、特にクライアントが更新したいフィールドのみを送信するPATCHエンドポイントで、required と optional プロパティを調整します。