2016-03-30 4 views
9

Ich versuche, eine Swagger-Schemadefinition für ein Objekt zu definieren, das ein Array von Objekten unterschiedlicher Typen enthält.Wie erstellen Sie ein Swagger-Schema, das ein Array verschiedener Typen enthält

Hier ist das JSON-Schema für ein Vorlagenobjekt (und alle zugehörigen Objekttypen). Ich bin mir bewusst, dass Swagger das OneOf-Prädikat nicht unterstützt, also versuche ich nur herauszufinden, wie man diese Datenstruktur in Prahlerei beschreibt. Ich habe auf dieser Syntax viele Varianten ausprobiert, aber keine hat gearbeitet und das war die nächste, die ich auf der Grundlage der Spezifikation kommen könnte und einige Beispiele hier: 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' 

Antwort

10

OpenAPI-Spezifikation 3.0 wird oneOf und anyOf unterstützen.

In 2.0 können Sie ein Objekt mit verschiedenen Eigenschaften als nur type: object (Freiformobjekt) definieren. Für Ihren Fall, können Sie dies tun:

 schema: 
     type: array 
     items: 
      type: object 
+5

Dies schließt nicht die Frage beantworten, ob Sie diese Objekte definieren möchten. Oder Sie haben kein Modell, das akzeptabel, aber sicher nicht das beste wäre. – koxon

+0

Damit können Sie nur ein Element in Ihrem Array haben. ist scheiße. –

5

Sie die items: Bezug auf den Basistyp einstellen. Das Vererbungsmodell unterscheidet sich beim Export von president spezifisch nach Sprache, aber in der Praxis legen Methodendefinitionen die zulässigen Parametertypen mithilfe des Basismodells fest, wenn Sie mehrere Unterklassen akzeptieren möchten, die dasselbe Basismodell erben.

Swagger Schnipsel -

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 

Pseudo-Code -

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);