2017-08-08 2 views
2

Angesichts der folgenden OpenAPI-Definition, welche der folgenden Objekte gültig sind. Nur 1. oder 1. und 2.?Was bedeutet "erforderlich" in OpenAPI wirklich

Person: 
    required: 
    - id 
    type: object 
    properties: 
    id: 
     type: string 
  1. {"id": ""}
  2. {"id": null}
  3. {}

Dies läuft auf die Frage hinaus, ob "required = true" bedeutet "nicht-null Wert" oder "Eigenschaft muss anwesend sein".

Der Validator JSON Schema bei https://json-schema-validator.herokuapp.com/ sagt, dass 2. ungültig, da null nicht die type: string Einschränkung nicht erfüllt. Beachten Sie, dass es sich nicht beschwert, da id null ist, aber weil null keine Zeichenfolge ist. ABER Wie relevant ist das für OpenAPI/Swagger?

Antwort

4

Das required Schlüsselwort in OpenAPI- hat die gleiche Bedeutung wie in JSON Schema:

erforderlich

eine Objektinstanz gültig ist gegen dieses Schlüsselwort, wenn sein Objekt-Array-Wert alle Elemente in diesem Schlüsselwort der enthält .

Die Formulierung im latest JSON Schema spec (obwohl es nicht der von OpenAPI verwendet ist) ist klar:

Eine Objektinstanz gegen dieses Schlüsselwort gültig ist, wenn ist jedes Element im Array der Name eine Eigenschaft in der Instanz.

Das heißt, required bedeutet "Eigenschaft muss vorhanden sein", unabhängig vom Wert. Die type, format usw. des Eigenschaftswerts sind separate Integritätsbedingungen, die separat von required ausgewertet werden, aber zusammen als kombiniertes Schema.

In Ihrem Beispiel:

  1. {"id": ""} gilt:

    • ✓ validiert gegen required
    • ✓ den Wert "" validiert gegen type: string
  2. {"id": null} ist nicht gültig:

    • ✓ validiert gegen required
    • null prüft nicht gegen type: string
  3. {} nicht gültig ist:

    • ✗ prüft nicht gegen required

Beachten Sie, dass null als Typ nicht in OpenAPI unterstützt wird, aber OpenAPI 3.0 fügt die nullable Attribut, um anzuzeigen, dass der Wert null sein kann. Also würde {"id": null} gegen dieses OpenAPI 3.0 Schema validieren:

Person: 
    required: 
    - id 
    type: object 
    properties: 
    id: 
     type: string 
     nullable: true # <---- 
+0

Große Antwort, danke. Nicht der Fehler, dass die JSON-Schemaspezifikation nicht gut mit dem JavaScript/JSON-Konzept von "null" übereinstimmt. –

+0

@ MarcelStör JSON-Schema hat den Typ "null", und ein Nullable-Schema kann als '{" type "definiert werden: [" string "," null "]}'. OpenAPI unterstützt jedoch nicht "type: null" und verwendet stattdessen das Attribut "nullable". – Helen

1

OpenAPI verweist auf JSON-Schema in diesen Angelegenheiten und von dem, was ich in JSON Schema Null sagen kann, ist eine gültige Zeichenfolge.

Es sollte beachtet werden, dass das Null-Zeichen (\ u0000) in einem JSON String gültig ist.

Meine Lesung der Definition von ist, dass Vorhandensein der Eigenschaft Gültigkeit impliziert.


Update: Es sieht aus wie ich bin falsch. Es scheint, dass JSON Schema den Wert null nicht als äquivalent zu \ u0000 gilt. Das würde bedeuten, dass null kein gültiger Wert für eine Zeichenfolge ist.

+0

Danke! "valide ... wenn jedes Element im Array der Name einer Eigenschaft in der Instanz ist" scheint darauf hinzuweisen, dass '{" id ": null}' tatsächlich gültig ist. Da "null" nicht ganz dasselbe ist wie das Null-Zeichen, müsste ich '{" id ":" \ u0000 "}} schreiben, um den JSON-Schema-Validator zu erfüllen - und das ist wieder ganz anders als' { "id": null} '. –

Verwandte Themen