引用OpenAPI 2.0, Schema Object或Swagger 2.0, Schema Object以及discriminator
字段的定义为:
添加对多态性的支持。鉴别符是架构属性名称,用于区分继承此架构的其他架构。必须在此模式中定义使用的属性名称,它必须位于
required
属性列表中。使用时,值必须是此模式的名称或继承它的任何模式。
我的困惑/问题:
discriminator
,说明它究竟做了什么以及如果我们不使用它会怎样?是否有任何错误,警告或任何依赖于某些操作的工具?discriminator
,是否会在其他工具中使用此字段?到目前为止我尝试了什么:
Dog
模型扩展到更深层次并在新的子模型上尝试相同,但我没有看到swagger-editor预览中的任何更改。 / LI>
我用来做实验的示例代码:
definitions:
Pet:
type: object
discriminator: petType
properties:
name:
type: string
petType:
type: string
required:
- name
- petType
Cat:
description: A representation of a cat
allOf:
- $ref: '#/definitions/Pet'
- type: object
properties:
huntingSkill:
type: string
description: The measured skill for hunting
default: lazy
enum:
- clueless
- lazy
- adventurous
- aggressive
required:
- huntingSkill
Dog:
description: A representation of a dog
allOf:
- $ref: '#/definitions/Pet'
- type: object
properties:
packSize:
type: integer
format: int32
description: the size of the pack the dog is from
default: 0
minimum: 0
required:
- packSize
答案 0 :(得分:10)
根据此google group,discriminator
在allOf
属性的顶部使用,并且它在超类型中定义为多态。如果未使用discriminator
,则allOf
关键字会描述模型包含其他合成模型的属性。
就像您的示例代码一样,Pet
是超级类型,其属性petType
标识为discriminator
,而Cat
是Pet
的子类型}。以下是Cat
对象的json示例:
{
"petType": "Cat",
"name": "Kitty"
}
使用discriminator
意图指示用于标识对象类型的属性。假设有一些工具可以使用discriminator
正确支持定义对象,可以通过扫描属性来确定类型。例如,根据Cat
确定对象为petType
。
但是,discriminator
字段在当前版本的规范或样本中没有明确定义(请参阅issue #403)。据我所知,目前Swagger没有提供适当支持的工具。
discriminator
。在这种情况下,它自然适合,它可以用作其他开发人员理解多态关系的指标。如果考虑使用ReDoc支持discriminator
的第三方工具(请参阅此gif和example中的petType
),您可能会觉得这很有用。
答案 1 :(得分:4)
OpenApi 3中的鉴别器功能得到了很大改进。现在提供一个鉴别器对象,它包含鉴别器属性的名称,以及该属性值到模式名称的映射。
(我知道你确实问过OpenApi 2,但是在3中有很多改进,希望你可以使用它。)
请参阅:https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#discriminatorObject了解实际规格