J'essaie de définir une définition de schéma swagger pour un objet qui contient un tableau d'objets de types différents.
Voici le schéma json pour un objet modèle (et tous les types d'objets associés). Je suis conscient que swagger ne prend pas en charge le prédicat oneOf, j'essaie simplement de comprendre comment décrire cette structure de données dans swagger. J'ai essayé de nombreuses variantes de cette syntaxe, mais aucune n'a fonctionné et c'était le plus proche que je pouvais venir en fonction des spécifications et des exemples trouvés ici: 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'
La spécification OpenAPI 3.0 prend en charge oneOf
et anyOf
.
Dans 2.0, vous pouvez définir un objet avec des propriétés variables comme simplement type: object
(objet de forme libre). Pour votre cas, vous pouvez le faire:
schema:
type: array
items:
type: object
Vous pouvez définir le items:
référence au type de base. Le modèle d'héritage variera selon la langue lors de l'exportation de swagger en particulier, mais dans la pratique, les définitions de méthode spécifient les types de paramètres acceptables à l'aide du modèle de base si vous souhaitez pouvoir accepter plusieurs sous-classes qui héritent du même modèle de base.
Extrait 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);