2014-10-05 8 views
27

beschreiben Ich versuche Swagger zu beschreiben, Web-API, die ich baue. Das Problem ist, dass ich nicht verstehe, wie komplexe JSON-Objekt zu beschreiben?Wie kann ich komplexe JSON-Modell in Swagger

Zum Beispiel, wie diese beschreiben Objekte:

{ 
    name: "Jhon", 
    address: [ 
    { 
     type: "home", 
     line1: "1st street" 
    }, 
    { 
     type: "office", 
     line1: "2nd street" 
    } 
    ] 
} 
+2

Die Antwort unterscheidet zwischen Swagger 1.2 und Swagger 2.0. Welchen Plan hast du? – Ron

+1

Swagger 2.0. Danke –

+1

Suchen Sie nach der JSON-Darstellung oder einer YAML-Datei, die mit dem Swagger-Editor verwendet werden soll? Sobald ich diese Informationen habe, kann ich Ihnen ein relevantes Snippet bereitstellen. – Ron

Antwort

38

Okay, so auf der Grundlage der obigen Ausführungen, möchten Sie das folgende Schema:

{ 
    "definitions": { 
    "user": { 
     "type": "object", 
     "required": [ "name" ], 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "address": { 
      "type": "array", 
      "items": { 
      "$ref": "#/definitions/address" 
      } 
     } 
     } 
    }, 
    "address": { 
     "type": "object", 
     "properties": { 
      "type": { 
       "type": "string", 
       "enum": [ "home", "office" ] 
      }, 
      "line1": { 
       "type": "string" 
      } 
     } 
    } 
    } 
} 

ich einige Annahmen gemacht haben Machen Sie die Probe ein bisschen komplizierter, um in der Zukunft zu helfen. Für das Objekt "user" habe ich erklärt, dass das Feld "name" obligatorisch ist. Wenn Sie zum Beispiel die Adresse auch zwingend benötigen, können Sie die Definition in "erforderlich" ändern: ["Name", "Adresse"].

Wir verwenden im Grunde eine Teilmenge von JSON-Schema, um die Modelle zu beschreiben. Natürlich weiß es nicht jeder, aber es ist ziemlich einfach zu lernen und zu benutzen.

Für den Adresstyp können Sie sehen, dass ich auch das Limit auf zwei Optionen festlegen - entweder zu Hause oder im Büro. Sie können dieser Liste beliebige Elemente hinzufügen oder die "enum" vollständig entfernen, um diese Einschränkung zu entfernen.

Wenn der "Typ" einer Eigenschaft "Array" ist, müssen Sie es mit "Elemente", die den internen Typ des Arrays deklariert begleiten. In diesem Fall habe ich auf eine andere Definition verwiesen, aber diese Definition könnte auch Inline sein. Normalerweise ist es einfacher, dies zu tun, besonders wenn Sie die Definition "Adresse" alleine oder in anderen Modellen benötigen.

Wie gewünscht, die Inline-Version:

{ 
    "definitions": { 
    "user": { 
     "type": "object", 
     "required": [ 
     "name" 
     ], 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     "address": { 
      "type": "array", 
      "items": { 
      "type": "object", 
      "properties": { 
       "type": { 
       "type": "string", 
       "enum": [ 
        "home", 
        "office" 
       ] 
       }, 
       "line1": { 
       "type": "string" 
       } 
      } 
      } 
     } 
     } 
    } 
    } 
} 
+0

Vielen Dank für die ausführliche Antwort. Wenn du nett genug bist, um auch ein Beispiel für Inline zu sein, wird es großartig. Eine andere Frage ist SwaggerUI unterstützt dieses komplexe Objektschema? Weil es von mir nicht getestet wird. –

+0

Ich habe die Antwort mit der Inline-Version geändert. – Ron

+0

Wie für Swagger-UI sollte es komplexe Schemas unterstützen. Ich müsste ein vollständiges Beispiel sehen, um zu verstehen, was falsch ist. Sie können unsere Google Group auch für solche Fragen verwenden. – Ron