Selon votre situation, il ya quelques approches différentes. Je ne peux penser à de quatre manières différentes d'conditionnellement besoin d'un champ.
Dépendances
L' dependencies
mot-clé est une variance conditionnelle de l' required
mot-clé. Foreach propriété en dependencies
, si la propriété est présent dans le JSON en cours de validation, puis le schéma associé à cette clé doit également être valable. Si le "foo" la propriété est présent, alors le "bar" de la propriété est nécessaire
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
Il y a aussi un court formulaire, si le schéma ne contient que l' required
mot-clé.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
Implication
Si votre état de santé dépend de la valeur d'un champ, vous pouvez utiliser une logique booléenne concept d'implication. "A implique B" signifie que, si A est vrai alors B doit être aussi vrai. Implication peut aussi être exprimée en "!A ou B". Le "foo" la propriété n'est pas égal à "bar", ou le "bar" de la propriété est nécessaire. Ou, en d'autres termes: Si les "foo" la propriété est égale à "bar", Puis le "bar" de la propriété est nécessaire
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "enum": ["bar"] }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
Si "toto" n'est pas égal à "bar", #/anyOf/0
des matchs et la validation réussit. Si "toto" est synonyme de "bar", #/anyOf/0
d'échec et d' #/anyOf/1
doit être valable pour l' anyOf
de validation pour être couronnée de succès.
Enum
Si votre condition est basée sur un enum, c'est un peu plus simple. "foo" peut-être "bar" ou "baz". Si "toto" est synonyme de "bar", puis "barre" est nécessaire. Si "toto" est synonyme de "baz", puis "baz" est nécessaire.
{
"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
Un ajout relativement récent à JSON Schema (projet-07) ajoute l' if
, then
et else
mots-clés. Si le "foo" la propriété est égale à "bar", Puis le "bar" de la propriété est nécessaire
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "enum": ["bar"] }
}
},
"then": { "required": ["bar"] }
}
EDIT 12/23/2017: Implication de la section mise à jour et Si-Alors-Sinon " section.