Dans jsonSchema, vous pouvez indiquer si les champs définis sont obligatoires ou non en utilisant l' required
attribut:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"header": {
"type": "object",
"properties": {
"messageName": {
"type": "string"
},
"messageVersion": {
"type": "string"
}
},
"required": [
"messageName",
"messageVersion"
]
}
},
"required": [
"header"
]
}
Dans certains cas, je souhaite que le messageVersion
champ ne soit pas obligatoire. Existe-t-il un moyen de rendre le caractère obligatoire de ce champ conditionnel?
jsonschema
Tom Redfern
la source
la source
Réponses:
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 durequired
mot - clé. Propriété Foreach dansdependencies
, 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 requiseIl existe également une forme courte si le schéma ne contient que le
required
mot - clé.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
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 laanyOf
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.
Si-Alors-Sinon
Un ajout relativement récent au schéma JSON (draft-07) ajoute les mots - clés
if
,then
etelse
. Si la propriété "foo" est égale à "bar", alors la propriété "bar" est requiseEDIT 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
à utiliserconst
.la source
if-then-else
mots - clés et je refuse de les utiliser. Mais, si vous choisissez de l'utiliser, je suggère de toujours les envelopper dans unallOf
qui ne contient que ces trois mots-clés.{ ...other_keywords..., "allOf": [{ "if": ..., "then": ..., "else": ... }], ...more_keywords... }
if...
? Je pense qu'une brève opinion à ce sujet dans votre réponse serait tout à fait justifiée. Ou est-ce une longue histoire?if
,then
etelse
enfreignent cette règle car ils dépendent les uns des autres.allOf
== AND,anyOf
== OR,oneOf
== XOR etnot
== NOT. Vous pouvez google "algèbre booléenne" pour plus de ressources sur les choses mathématiques (comme l'implication).