【OpenAPI】unevaluatedProperties
unevaluatedProperties はこれまでの検証でまだ評価されていないプロパティに対して、どう扱うかを指定するもの。バージョン3.1以降で使える。
値には false やスキーマを置ける。
false : 未評価のプロパティは禁止
スキーマ : 未評価のプロパティはそのスキーマに適合しなければならない
「評価」とは、そのプロパティに対して何らかの検証が行われたことを意味し、properties や patternProperties で定義されたものは評価済みになる。
additionalProperties との違い
additionalProperties :
判定タイミング : 同じスキーマ内で定義されていないプロパティを即判定
allOf との組み合わせ : 他のスキーマで定義されたプロパティも「未定義」とみなしてしまい、誤って弾くことがある
unevaluatedProperties :
スキーマ全体(合成含む)でまだ評価されていないプロパティを最後に判定
他のスキーマで定義されたプロパティは評価済みとして扱うため、弾かない
code:yaml
allOf:
- $ref: '#/Base'
- type: object
properties:
extra: { type: string }
additionalProperties: false
この 2つ目スキーマは Base のプロパティを知らないので、Base 側のプロパティまで「追加」とみなしてしまい、バリデーションエラーになる。
code:yaml
allOf:
- $ref: '#/Base'
- type: object
properties:
extra: { type: string }
- unevaluatedProperties: false
最後の unevaluatedProperties: false は「ここまでの allOf で評価されたプロパティ以外を禁止」を意味するので Base 側のプロパティも extra も許可され、それ以外だけ禁止になる。