当请求正文或响应有效负载可能是许多不同模式之一时,可以使用 discriminator
对象来帮助进行序列化、反序列化和验证。鉴别器是模式中的特定对象,用于根据与其关联的值向文档使用者告知备用模式。
使用鉴别器时,将不考虑内联模式。
4.8.25.1 固定字段
字段名称 | 类型 | 描述 |
---|---|---|
propertyName | 字符串 | 必需。有效负载中将保存鉴别器值的属性的名称。 |
mapping | Map[string , string ] | 一个对象,用于保存有效负载值和模式名称或引用之间的映射。 |
此对象*可以使用 规范扩展 进行扩展。
仅当使用组合关键字 oneOf
、anyOf
、allOf
之一时,鉴别器对象才合法。
在 OAS 3.0 中,响应有效负载可以被描述为正好是任意数量类型之一
MyResponseType:
oneOf:
- $ref: '#/components/schemas/Cat'
- $ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Lizard'
这意味着有效负载必须通过验证与 Cat
、Dog
或 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
。