OpenAPI 规范 v3.1.0
OpenAPI 规范 v3.1.0
1. OpenAPI 规范
2. 简介
3. 定义
4. 规范
4.1 版本
4.2 格式
4.3 文档结构
4.4 数据类型
4.5 富文本格式化
4.6 URI 中的相对引用
4.7 URL 中的相对引用
4.8 模式
4.9 规范扩展
4.10 安全过滤
4.8.25 Discriminator 对象
创建时间: 2025-05-29 16:38

当请求正文或响应有效负载可能是许多不同模式之一时,可以使用 discriminator 对象来帮助进行序列化、反序列化和验证。鉴别器是模式中的特定对象,用于根据与其关联的值向文档使用者告知备用模式。

使用鉴别器时,将不考虑内联模式。

4.8.25.1 固定字段
字段名称类型描述
propertyName字符串必需。有效负载中将保存鉴别器值的属性的名称。
mappingMap[stringstring]一个对象,用于保存有效负载值和模式名称或引用之间的映射。

此对象*可以使用 规范扩展 进行扩展。

仅当使用组合关键字 oneOfanyOfallOf 之一时,鉴别器对象才合法。

在 OAS 3.0 中,响应有效负载可以被描述为正好是任意数量类型之一

MyResponseType:
  oneOf:
  - $ref: '#/components/schemas/Cat'
  - $ref: '#/components/schemas/Dog'
  - $ref: '#/components/schemas/Lizard'

这意味着有效负载必须通过验证与 CatDog 或 Lizard 描述的模式之一完全匹配。在这种情况下,鉴别器可以充当“提示”以缩短验证和匹配模式的选择,这可能是代价高昂的操作,具体取决于模式的复杂性。然后,我们可以准确地描述哪个字段告诉我们使用哪个模式

MyResponseType:
  oneOf:
  - $ref: '#/components/schemas/Cat'
  - $ref: '#/components/schemas/Dog'
  - $ref: '#/components/schemas/Lizard'
  discriminator:
    propertyName: petType

现在的期望是,响应有效负载中必须存在名为 petType 的属性,并且该值将对应于 OAS 文档中定义的模式的名称。因此,响应有效负载

{
  "id": 12345,
  "petType": "Cat"
}

将指示与此有效负载一起使用 Cat 模式。在鉴别器字段的值与模式名称不匹配或无法进行隐式映射的情况下,可以使用可选的 mapping 定义

MyResponseType:
  oneOf:
  - $ref: '#/components/schemas/Cat'
  - $ref: '#/components/schemas/Dog'
  - $ref: '#/components/schemas/Lizard'
  - $ref: 'https://gigantic-server.com/schemas/Monster/schema.json'
  discriminator:
    propertyName: petType
    mapping:
      dog: '#/components/schemas/Dog'
      monster: 'https://gigantic-server.com/schemas/Monster/schema.json'

这里,鉴别器 dog 将映射到模式 #/components/schemas/Dog,而不是 Dog 的默认(隐式)值。如果鉴别器与隐式或显式映射不匹配,则无法确定任何模式,并且验证应该失败。映射键必须是字符串值,但工具可以将响应值转换为字符串以进行比较。

与 anyOf 结构一起使用时,鉴别器的使用可以避免多个模式可能满足单个有效负载的情况下的歧义。

在 oneOf 和 anyOf 的两种使用情况下,必须明确列出所有可能的模式。为了避免冗余,可以将鉴别器添加到父模式定义中,并且 allOf 结构中构成父模式的所有模式都可以用作备用模式。 例如

components:
  schemas:
    Pet:
      type: object
      required:
      - petType
      properties:
        petType:
          type: string
      discriminator:
        propertyName: petType
        mapping:
          dog: Dog
    Cat:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Cat`
        properties:
          name:
            type: string
    Dog:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Dog`
        properties:
          bark:
            type: string
    Lizard:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Lizard`
        properties:
          lovesRocks:
            type: boolean

这样的有效负载

{
  "petType": "Cat",
  "name": "misty"
}

将指示使用 Cat 模式。同样,此模式

{
  "petType": "dog",
  "bark": "soft"
}

由于 mapping 元素中的定义,将映射到 Dog

最后更新: -