2016-03-30 10 views
9

Próbuję zdefiniować definicję schematu przechwytu dla obiektu zawierającego tablicę obiektów o różnych typach.W jaki sposób utworzyć schemat przechwytu, który zawiera tablicę różnych typów:

Oto schemat json dla obiektu szablonu (i wszystkich powiązanych typów obiektów). Jestem świadomy, że swagger nie obsługuje predykatu oneOf, więc próbuję po prostu dowiedzieć się, jak opisać tę strukturę danych w swagger. Próbowałem wiele wariacji na temat tej składni, ale żaden z nich nie pracował i był to najbliżej mogę przyjść na podstawie specyfikacji i znaleźć kilka przykładów tutaj: 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' 

Odpowiedz

10

OpenAPI Specyfikacja 3.0 będzie wspierać oneOf i anyOf.

W wersji 2.0 można zdefiniować obiekt o różnych właściwościach jako type: object (obiekt o dowolnych kształtach). W Twoim przypadku, możesz to zrobić:

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

To nie jest odpowiedź na pytanie, czy chcesz zdefiniować te obiekty. Albo kończy się bez modelu, który mógłby być akceptowalny, ale na pewno nie najlepszy. – koxon

+0

To również pozwala na posiadanie tylko jednego elementu w twojej tablicy. ssie. –

5

Można ustawić odwołanie do typu bazowego items:. Model dziedziczenia będzie się różnić w zależności od języka podczas eksportowania, ale w praktyce definicje metod określają dopuszczalne typy parametrów przy użyciu modelu podstawowego, jeśli chcesz mieć możliwość akceptowania wielu podklas dziedziczących ten sam model podstawowy.

Swagger fragment -

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 

pseudokod -

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