Selon votre situation, il existe plusieurs approches différentes. Je peux penser à quatre façons différentes d'exiger conditionnellement un champ.
Dépendances
Le dependencies
mot-clé est une variante conditionnelle du required
mot - clé. Propriété Foreach dans dependencies
, si la propriété est présente dans le JSON en cours de validation, le schéma associé à cette clé doit également être valide. Si la propriété "foo" est présente, alors la propriété "bar" est requise
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
Il existe également une forme courte si le schéma ne contient que le required
mot - clé.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
Implication
Si votre condition dépend de la valeur d'un champ, vous pouvez utiliser un concept logique booléen appelé implication. «A implique B» signifie effectivement que si A est vrai, alors B doit également être vrai. L'implication peut également être exprimée par "! A ou B". Soit la propriété "foo" n'est pas égale à "bar", soit la propriété "bar" est requise . Ou, en d'autres termes: si la propriété "foo" est égale à "bar", alors la propriété "bar" est requise
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
Si "foo" n'est pas égal à "bar", les #/anyOf/0
correspondances et la validation réussissent. Si "foo" est égal à "bar", #/anyOf/0
échoue et #/anyOf/1
doit être valide pour que la anyOf
validation réussisse.
Enum
Si votre conditionnel est basé sur une énumération, c'est un peu plus simple. "foo" peut être "bar" ou "baz". Si "foo" est égal à "bar", alors "bar" est requis. Si "foo" est égal à "baz", alors "baz" est requis.
{
"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"]
}
]
}
Si-Alors-Sinon
Un ajout relativement récent au schéma JSON (draft-07) ajoute les mots - clés if
, then
et else
. Si la propriété "foo" est égale à "bar", alors la propriété "bar" est requise
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
EDIT 12/23/2017: section Implication mise à jour et section If-Then-Else ajoutée.
EDIT 06/04/2018: Correction de bug pour If-Then-Else et mise à jour des singleton enum
à utiliser const
.