2016-08-02 18 views
16

In jsonSchema können Sie angeben, ob definierte Felder sind Pflichtfelder oder nicht mit dem „erforderlich“ -Attribut:jsonSchema Attribut erforderlich bedingt

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
     "header": { 
      "type": "object", 
      "properties": { 
       "messageName": { 
        "type": "string" 
       }, 
       "messageVersion": { 
        "type": "string" 
       } 
      }, 
      "required": [ 
       "messageName", 
       "messageVersion" 
      ] 
     } 
    }, 
    "required": [ 
     "header" 
    ] 
} 

In bestimmten Fällen würde Ich mag das Message Feld nicht obligatorisch sein. Gibt es eine Möglichkeit, die Verbindlichkeit dieses Feldes zu konditionieren?

+0

Ja, sollte es möglich sein. Welche Informationen in den Daten würden die Pflichtfunktion auslösen? – jruizaranguren

+0

Wie mache ich das mit Version 3? –

+0

@SarveswaranMeenakshiSundaram - Ich weiß nicht, ich habe nur v4 von JSON-Schema verwendet –

Antwort

41

Abhängig von Ihrer Situation gibt es ein paar verschiedene Ansätze. Ich kann mir vier verschiedene Möglichkeiten vorstellen, um ein Feld bedingt zu benötigen.

Abhängigkeiten

dependencies Das Schlüsselwort ist eine bedingte Variation des required Schlüsselwort. Foreach-Eigenschaft in dependencies: Wenn die Eigenschaft in dem zu überprüfenden JSON vorhanden ist, muss das diesem Schlüssel zugeordnete Schema ebenfalls gültig sein. Wenn die „foo“ Eigenschaft vorhanden ist, dann ist die „Bar“ Eigenschaft erforderlich ist

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "dependencies": { 
    "foo": { "required": ["bar"] } 
    } 
} 

Es gibt auch eine Kurzform, wenn das Schema enthält nur die required Schlüsselwort.

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "dependencies": { 
    "foo": ["bar"] 
    } 
} 

Implikation

Wenn Ihr Zustand auf dem Wert eines Feldes abhängig ist, können Sie einen Booleschen Logik Konzept Implikation genannt verwenden. "A impliziert B" bedeutet effektiv, wenn A wahr ist, dann muss B auch wahr sein. Die Implikation kann auch als "! A oder B" ausgedrückt werden. Entweder ist die Eigenschaft "foo" nicht gleich "bar", oder die Eigenschaft "bar" ist erforderlich. Oder mit anderen Worten: Wenn die „foo“ Eigenschaft gleich „bar“, dann die „bar“ Eigenschaft erforderlich ist

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "anyOf": [ 
    { 
     "not": { 
     "properties": { 
      "foo": { "enum": ["bar"] } 
     }, 
     "required": ["foo"] 
     } 
    }, 
    { "required": ["bar"] } 
    ] 
} 

Wenn „foo“ nicht gleich „bar“, #/anyOf/0 Spiele und Validierung gelingt es. Wenn "foo" gleich "bar" ist, muss #/anyOf/0 fehlschlagen und #/anyOf/1 muss gültig sein, damit die anyOf Validierung erfolgreich ist.

Enum

Wenn der Bedingung einer ENUM basiert, es ist eine gerade nach vorne wenig. "foo" kann "bar" oder "baz" sein. Wenn "foo" gleich "bar" ist, ist "bar" erforderlich. Wenn "foo" gleich "baz" ist, wird "baz" benötigt.

{ 
    "type": "object", 
    "properties": { 
    "foo": { "enum": ["bar", "baz"] }, 
    "bar": { "type": "string" }, 
    "baz": { "type": "string" } 
    }, 
    "anyOf": [ 
    { 
     "properties": { 
     "foo": { "enum": ["bar"] } 
     }, 
     "required": ["bar"] 
    }, 
    { 
     "properties": { 
     "foo": { "enum": ["baz"] } 
     }, 
     "required": ["baz"] 
    } 
    ] 
} 

If-Then-Else

Eine relativ neue Ergänzung zu JSON Schema (draft-07) fügt die if, then und else Keywords. Implikation Bereich aktualisiert und If-Then-Else-Abschnitt hinzugefügt: Wenn die "foo" Eigenschaft gleich "bar", dann wird die "bar" Eigenschaft

{ 
    "type": "object", 
    "properties": { 
    "foo": { "type": "string" }, 
    "bar": { "type": "string" } 
    }, 
    "if": { 
    "properties": { 
     "foo": { "enum": ["bar"] } 
    } 
    }, 
    "then": { "required": ["bar"] } 
} 

EDIT 2017.12.23 erforderlich.

+2

Super Antwort, danke. Dies entspricht vollständig meinem Szenario! –

+0

Dies ist nur eine solche hilfreiche Referenz. Kommen wir täglich dazu :) – Owen