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 dependenciesSchlüsselwort ist eine bedingte Variation des requiredSchlü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 requiredSchlü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/0schlägt dies fehl und #/anyOf/1muss gültig sein, damit die anyOfValidierung 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, thenund elseSchlü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 enumzur Verwendung const.