In jsonSchema können Sie mithilfe des required
Attributs angeben, ob definierte Felder obligatorisch sind oder nicht :
{
"$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 möchte ich, dass das messageVersion
Feld nicht obligatorisch ist. Gibt es eine Möglichkeit, die Verpflichtung dieses Feldes abhängig zu machen?
jsonschema
Tom Redfern
quelle
quelle
Antworten:
Abhängig von Ihrer Situation gibt es verschiedene Ansätze. Ich kann mir vier verschiedene Möglichkeiten vorstellen, ein Feld bedingt zu benötigen.
Abhängigkeiten
Das
dependencies
Schlüsselwort ist eine bedingte Variation desrequired
Schlüsselworts. Für jede Eigenschaft in mussdependencies
, wenn die Eigenschaft in dem zu validierenden JSON vorhanden ist, auch das diesem Schlüssel zugeordnete Schema gültig sein. Wenn die Eigenschaft "foo" vorhanden ist, ist die Eigenschaft "bar" erforderlichEs gibt auch eine Kurzform, wenn das Schema nur das
required
Schlüsselwort enthält .Implikation
Wenn Ihre Bedingung vom Wert eines Feldes abhängt, können Sie ein boolesches Logikkonzept namens Implikation verwenden. "A impliziert B" bedeutet effektiv, wenn B wahr ist, muss B auch wahr sein. Implikation kann auch als "! A oder B" ausgedrückt werden. Entweder entspricht die Eigenschaft "foo" nicht "bar", oder die Eigenschaft "bar" ist erforderlich . Oder mit anderen Worten: Wenn die Eigenschaft "foo" gleich "bar" ist, ist die Eigenschaft "bar" erforderlich
Wenn "foo" nicht gleich "bar" ist, sind
#/anyOf/0
Übereinstimmungen und Validierungen erfolgreich. Wenn "foo" gleich "bar" ist,#/anyOf/0
schlägt dies fehl und#/anyOf/1
muss gültig sein, damit dieanyOf
Validierung erfolgreich ist.Aufzählung
Wenn Ihre Bedingung auf einer Aufzählung basiert, ist sie etwas einfacher. "foo" kann "bar" oder "baz" sein. Wenn "foo" gleich "bar" ist, ist "bar" erforderlich. Wenn "foo" gleich "baz" ist, ist "baz" erforderlich.
Wenn-Dann-Sonst
Eine relativ neue Ergänzung zu JSON Schema (draft-07) fügt die
if
,then
undelse
Schlüsselwörter. Wenn die Eigenschaft "foo" gleich "bar" ist, ist die Eigenschaft "bar" erforderlichEDIT 23.12.2017: Implikationsabschnitt aktualisiert und If-Then-Else-Abschnitt hinzugefügt.
EDIT 06/04/2018: Bugfix für If-Then-Else und Update Singletons
enum
zur Verwendungconst
.quelle
if-then-else
Keywords und lehne es ab, sie zu verwenden. Wenn Sie es jedoch verwenden möchten, empfehle ich, sie immer in ein Zeichen zu verpackenallOf
, das nur diese drei Schlüsselwörter enthält.{ ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
if...
? Ich denke, eine kurze Meinung dazu in Ihrer Antwort wäre völlig gerechtfertigt. Oder ist es eine lange Geschichte?if
,then
Undelse
verletzen diese Regel , weil sie voneinander abhängig sind .allOf
== AND,anyOf
== OR,oneOf
== XOR undnot
== NOT. Sie können "Boolesche Algebra" googeln, um mehr Ressourcen für die Mathematik zu erhalten (z. B. Implikation).