2015-01-09 4 views
8

Schreiben der Swagger-Modell für ein JSON-Array scheint mir ziemlich einfach, z. wenn ich diese Anordnung hatte:Swagger-Modell für ein Array mit benannten Elementen

[ 
    { 
    "name": "dave", 
    "number": 123 
    }, 
    { 
    "name": "mary", 
    "number": 456 
    } 
] 

Ich würde das folgende Prahlerei Modell für sie schreiben:

"schema": { 
    "type": "array", 
    "items": { 
    "$ref": "Student" 
    } 
} 

"Student": { 
    "id": "Student", 
    "required": [ 
    "name", 
    "number" 
    ], 
    "properties": { 
    "name": { 
     "type": "string" 
    }, 
    "number": { 
     "type": "integer", 
     "format": "int32" 
    } 
    } 
} 

Allerdings habe ich folgendes:

{ 
    "123": { 
    "name": "dave" 
    }, 
    "456": { 
    "name": "mary" 
    } 
} 

Wie schreibe ich das Modell für dieses?

Vielen Dank im Voraus.

+0

Das ist kein Array, das ist ein Objekt mit einer Karte darin. Ist es das, was Sie beschreiben wollen oder gibt es einen Fehler in der Probe? Welche Version von Swagger benutzt du? – Ron

+0

Sie haben Recht, es ist in der Tat nicht ein Array. Es ist kein Fehler, es ist genau der JSON, den ich beschreiben möchte, aber ich bin mir nicht sicher, wie ich das anstellen soll. Ich benutze Swagger 2.0 (obwohl ich zugeben muss, dass es einige 1.2 Reste in was ich geschrieben habe). – DeZot

+0

Wenn Sie vermeiden möchten, mit der Hand zu tippen, können Sie diesen JSON zu Swagger Definitionen Konverter versuchen: https://roger13.github.io/SwagDefGen/ – Roger

Antwort

10

Um das Anforderungsmodell zu beschreiben, müssen Sie die Eigenschaften additionalProperties verwenden. Wohlgemerkt, dies ist in Swagger 2.0 verfügbar und war in früheren Versionen nicht verfügbar.

"definitions": { 
    "Student": { 
     "type": "object", 
     "required": [ "name" ], 
     "properties": { 
      "name": { 
       "type": "string" 
      } 
     } 
    }, 
    "Students": { 
     "type": "object", 
     "additionalProperties": { 
      "$ref": "#/definitions/Student" 
     } 
    } 
} 

Oben sehen Sie die Student Modell, das derzeit die Eigenschaft „Name“ enthält, obwohl ich nehme an, Sie mehr zu ihm hinzufügen werde. In Ihrem obigen Beispiel ist die Eigenschaft "name" erforderlich. Das zweite Modell ist Students, das ein Objekt ist, das eine Zuordnung (additionalProperties) enthält. Jede Eigenschaft hat den Typ Student (erfolgt durch Referenzieren des Modells, könnte aber theoretisch inline definiert werden).

Die eine Sache, die Sie nicht tun können, ist zu deklarieren, dass der Schlüssel (oder der Name der Eigenschaft) eine ganze Zahl oder einen gegebenen Typ ist. Das könnte mit der patternedProperties unterstützt werden, die in Swagger 2.0 nicht verfügbar ist. Mit anderen Worten, es gibt keine technische Möglichkeit, den Inhalt des Schlüssels zu beschränken.

+1

Danke dafür. Es scheint mir jedoch, dass das Swagger-Ui es noch nicht unterstützt, als, als ich es versuchte, alles, was ich sah, war ein leeres Objekt. Die Vorschau des Swagger-Editors zeigt mir auch ein leeres Objekt, obwohl es keine Fehler meldet. – DeZot

+0

Richtig, ich glaube, die Benutzeroberfläche unterstützt derzeit keine zusätzlichen Eigenschaften. Fühlen Sie sich frei, ein Problem darüber zu öffnen. – Ron

Verwandte Themen