json 如何创建包含不同类型数组的 swagger 模式
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/36318849/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do you create a swagger schema that includes an array of varying types
提问by Mike Storey
I'm attempting to define a swagger schema definition for an object that contains an array of objects of varying types.
我正在尝试为包含不同类型对象数组的对象定义一个 swagger 模式定义。
Here is the json schema for a template object (and all related object types). I'm aware that swagger does not support the oneOf predicate, so I'm just trying to figure out how to describe this data structure in swagger. I've tried many variations on this syntax, but none have worked and this was the closest I could come based on the spec and some examples found here: http://json-schema.org/example2.html
这是模板对象(以及所有相关对象类型)的 json 模式。我知道 swagger 不支持 oneOf 谓词,所以我只是想弄清楚如何在 swagger 中描述这个数据结构。我已经尝试了这种语法的许多变体,但都没有奏效,这是我可以根据规范和此处找到的一些示例得出的最接近的方法:http: //json-schema.org/example2.html
swagger: '2.0'
info:
version: 1.0.0
title: IDMU
paths:
definitions:
template:
type: object
properties:
collection:
type: string
name:
type: string
columnValue:
type: string
description:
type: string
outputFile:
type: string
content:
type: string
directives:
type: array
items:
type: object
oneOf:
-
$ref: '#/definitions/directiveRequire'
-
$ref: '#/definitions/directiveReplace'
-
$ref: '#/definitions/directiveReplaceRowSql'
-
$ref: '#/definitions/directiveReplaceRowCsv'
-
$ref: '#/definitions/directiveReplaceColSql'
-
$ref: '#/definitions/directiveReplaceColCsv'
-
$ref: '#/definitions/directiveInsertTag'
-
$ref: '#/definitions/directiveInsertCsv'
-
$ref: '#/definitions/directiveInsertSql'
providerCsv:
type: object
properties:
type:
type: integer
maximum: 3
minimum: 3
tag:
type: string
url:
type: string
staticData:
type: string
providerTag:
type: object
properties:
type:
type: integer
maximum: 2
minimum: 2
tag:
type: string
condition:
type: integer
list:
type: boolean
value:
type: string
providerSql:
type: object
properties:
type:
type: integer
maximum: 1
minimum: 1
source:
type: string
columns:
type: string
from:
type: string
where:
type: string
directive:
type: object
discriminator: type
properties:
type:
type: integer
softFail:
type: boolean
required:
- type
directiveRequire:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
tags:
type: array
items:
type: string
directiveReplace:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
description:
type: string
from:
type: string
to:
type: string
directiveReplaceRowSql:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
description:
type: string
provider:
$ref: '#/definitions/providerSql'
directiveReplaceRowCsv:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
description:
type: string
provider:
$ref: '#/definitions/providerCsv'
directiveReplaceColCsv:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
description:
type: string
fromColumn:
type: string
toColumn:
type: string
provider:
$ref: '#/definitions/providerCsv'
directiveReplaceColSql:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
description:
type: string
fromColumn:
type: string
toColumn:
type: string
provider:
$ref: '#/definitions/providerSql'
directiveInsertTag:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
description:
type: string
notLast:
type: array
items:
type: string
onlyLast:
type: array
items:
type: string
provider:
$ref: '#/definitions/providerTag'
directiveInsertSql:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
description:
type: string
notLast:
type: array
items:
type: string
onlyLast:
type: array
items:
type: string
provider:
$ref: '#/definitions/providerSql'
directiveInsertCsv:
type: object
allOf:
- $ref: '#/definitions/directive'
- properties:
description:
type: string
notLast:
type: array
items:
type: string
onlyLast:
type: array
items:
type: string
provider:
$ref: '#/definitions/providerCsv'
回答by William Cheng
OpenAPI 3.0 supports oneOfand anyOf:
OpenAPI 3.0 支持oneOf和anyOf:
schema:
type: array
items:
oneOf:
- $ref: '#/components/schemas/directiveRequire'
- $ref: '#/components/schemas/directiveReplace'
- ...
In OpenAPI 2.0, you can define an object with varying properties as just type: object(free-form object). For your case, you may want to do this:
在 OpenAPI 2.0 中,您可以将具有不同属性的对象定义为 just type: object(free-form object)。对于您的情况,您可能想要这样做:
schema:
type: array
items:
type: object
回答by Josh
You can set the items:reference to the base type. The inheritance model will vary by language during export from swagger specifically, but in practice method definitions specify the acceptable parameter types using the base model if you want to be able to accept multiple subclasses that inherit the same base model.
您可以设置items:对基本类型的引用。在从 swagger 导出期间,继承模型将因语言而异,但实际上,如果您希望能够接受继承相同基本模型的多个子类,则方法定义使用基本模型指定可接受的参数类型。
Swagger snippet -
Swagger 片段 -
definitions:
template:
type: object
properties:
collection:
type: string
...
directives:
type: array
items:
$ref: '#/definitions/directive'
directive:
type: object
discriminator: type
properties:
type:
type: integer
softFail:
type: boolean
required:
- type
directiveRequire:
allOf:
- $ref: '#/definitions/directive'
- type: object
properties:
tags:
type: array
items:
type: string
directiveReplace:
allOf:
- $ref: '#/definitions/directive'
- type: object
properties:
description:
type: string
from:
type: string
to:
type: string
pseudocode -
伪代码——
class template {
// all the other properties
directive[] directives;
function addDirective(directive newDirective) {
this.directives.push(newDirective);
}
}
class directive {
int type;
boolean softFail;
}
class directiveRequire inherits directive {
//inherits type, softFail
string[] tags;
}
class directiveReplace {
//inherits type, softFail
string description;
string from;
string to;
}
template templateOne = new template();
directiveReplace directiveOne = new directiveReplace();
directiveOne.type = "replace";
directiveOne.softFail = false;
directiveOne.description = "first directive replace";
directiveOne.from = "first";
directiveOne.to = "one";
directiveRequire directiveTwo = new directiveRequire();
directiveTwo.type = "require";
directiveTwo.softFail = true;
directiveTwo.tags = ["second","directive"];
templateOne.addDirective(directiveOne);
templateOne.addDirective(directiveTwo);
回答by ipegasus
Sample API response that returns an array of videos
返回视频数组的示例 API 响应
responses:
'200':
description: An array of videos
schema:
type: array
items:
$ref: '#/definitions/Video'
Reference
参考

