在这个doc中,定义了两个模式:
components:
schemas:
Dog:
type: object
properties:
bark:
type: boolean
breed:
type: string
enum: [Dingo, Husky, Retriever, Shepherd]
Cat:
type: object
properties:
hunts:
type: boolean
age:
type: integer
然后医生说:
以下JSON对象有效对 架构
{
"bark": true,
"hunts": true,
"breed": "Husky",
"age": 3
}
如果对于在实例中显示的每个名称以及作为此关键字值的名称,该名称的子实例将成功验证相应的模式,则验证成功。
如果我理解正确,此对象对Dog
无效,因为它有一个意外的密钥hunts
,并且对Cat
无效,因为它有一个意外的密钥{{1 }}
为什么文档说这个对象对两个模式都有效?
答案 0 :(得分:2)
OpenAPI Schema Object支持additionalProperties
关键字,该关键字指定在实例中是否允许在架构中未明确定义的属性。
在OpenAPI 3.0中,默认情况下additionalProperties
= true
(与additionalProperties: {}
相同)。这就是为什么示例中的实例对两个模式都有效的原因。
如果您需要禁止额外的属性,请将additionalProperties: false
显式添加到您的架构中。
我没有找到定义此行为的here
additionalProperties: true
是默认值,目前尚未明确说明,但可以从其他语句中隐含。有一个PR明确提到这一点。
OpenAPI 3.0.1规范说(强调我的):
Schema Object ...是JSON Schema Specification Wright Draft 00的扩展子集。 ... 除非另有说明,否则属性定义遵循JSON模式。
和相应的JSON Schema Validation规范(Wright Draft 00)说:
如果" additionalProperties"如果不存在,则可以将其视为空模式作为值 ...
如果" additionalProperties"是一个对象,将值验证为所有未经"属性"验证的属性的模式。也不是" patternProperties"。
因此JSON Schema中的默认值为additionalProperties: {}
。空模式匹配任何实例,这相当于additionalProperties: true
。