How do you create a swagger schema that includes an array of varying types
OpenAPI 3.0 supports oneOf
and 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:
schema: type: array items: type: object
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.
Swagger snippet -
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);
Sample API response that returns an array of videos
responses: '200': description: An array of videos schema: type: array items: $ref: '#/definitions/Video'
Reference