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.
Ja, sollte es möglich sein. Welche Informationen in den Daten würden die Pflichtfunktion auslösen? – jruizaranguren
Wie mache ich das mit Version 3? –
@SarveswaranMeenakshiSundaram - Ich weiß nicht, ich habe nur v4 von JSON-Schema verwendet –