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 des required
Schlüsselworts. Für jede Eigenschaft in muss dependencies
, 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" erforderlich
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
Es gibt auch eine Kurzform, wenn das Schema nur das required
Schlüsselwort enthält .
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
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
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
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 die anyOf
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.
{
"type": "object",
"properties": {
"foo": { "enum": ["bar", "baz"] },
"bar": { "type": "string" },
"baz": { "type": "string" }
},
"anyOf": [
{
"properties": {
"foo": { "const": "bar" }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "const": "baz" }
},
"required": ["baz"]
}
]
}
Wenn-Dann-Sonst
Eine relativ neue Ergänzung zu JSON Schema (draft-07) fügt die if
, then
und else
Schlüsselwörter. Wenn die Eigenschaft "foo" gleich "bar" ist, ist die Eigenschaft "bar" erforderlich
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
EDIT 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 Verwendung const
.