A seconda della situazione, esistono diversi approcci. Posso pensare a quattro modi diversi per richiedere in modo condizionale un campo.
Dipendenze
La dependencies
parola chiave è una variazione condizionale della required
parola chiave. Foreach proprietà in dependencies
, se la proprietà è presente nel JSON da convalidare, anche lo schema associato a quella chiave deve essere valido. Se è presente la proprietà "foo", è richiesta la proprietà "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
C'è anche una forma breve se lo schema contiene solo la required
parola chiave.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
Coinvolgimento
Se la tua condizione dipende dal valore di un campo, puoi utilizzare un concetto logico booleano chiamato implicazione. "A implica B" significa effettivamente, se A è vero, allora anche B deve essere vero. L'implicazione può anche essere espressa come "! A o B". O la proprietà "foo" non è uguale a "bar" oppure è richiesta la proprietà "bar" . Oppure, in altre parole: se la proprietà "foo" è uguale a "bar", allora è richiesta la proprietà "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
Se "foo" non è uguale a "bar", la #/anyOf/0
corrispondenza e la convalida hanno esito positivo. Se "foo" è uguale a "bar", #/anyOf/0
fallisce e #/anyOf/1
deve essere valido affinché la anyOf
convalida abbia successo.
Enum
Se il tuo condizionale è basato su un'enumerazione, è un po 'più semplice. "foo" può essere "bar" o "baz". Se "foo" è uguale a "bar", allora "bar" è obbligatorio. Se "foo" è uguale a "baz", è necessario "baz".
{
"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"]
}
]
}
If-Then-Else
Una relativamente nuova aggiunta alla JSON Schema (progetto-07) aggiunge i if
, then
e le else
parole chiave. Se la proprietà "foo" è uguale a "bar", allora è richiesta la proprietà "bar"
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
EDIT 12/23/2017: sezione Implication aggiornata e sezione If-Then-Else aggiunta.
EDIT 06/04/2018: Correzione del bug per If-Then-Else e aggiornamento dei singleton enum
da utilizzare const
.