为什么此对象对OpenAPI 3.0中的两个模式都有效?

时间:2018-04-20 09:30:18

标签: openapi json-schema-validator

在这个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      
}

JSON Schema Validation规范说:

  

如果对于在实例中显示的每个名称以及作为此关键字值的名称,该名称的子实例将成功验证相应的模式,则验证成功。

如果我理解正确,此对象对Dog无效,因为它有一个意外的密钥hunts,并且对Cat无效,因为它有一个意外的密钥{{1 }}

为什么文档说这个对象对两个模式都有效?

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