Atsortingbut jsonSchema requirejs conditionnellement

Dans jsonSchema, vous pouvez indiquer si les champs définis sont obligatoires ou n’utilisent pas l’atsortingbut “required”:

{ "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "header": { "type": "object", "properties": { "messageName": { "type": "ssortingng" }, "messageVersion": { "type": "ssortingng" } }, "required": [ "messageName", "messageVersion" ] } }, "required": [ "header" ] } 

Dans certains cas, je voudrais que le champ messageVersion ne soit pas obligatoire. Existe-t-il un moyen de rendre conditionnelle l’obligation de ce champ?

    Selon votre situation, il existe différentes approches. Je peux imaginer quatre façons différentes d’exiger un champ.

    Les dépendances

    Le mot-clé dependencies est une variation conditionnelle du mot-clé required . Pour toute propriété dans les 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 requirejse

     { "type": "object", "properties": { "foo": { "type": "ssortingng" }, "bar": { "type": "ssortingng" } }, "dependencies": { "foo": { "required": ["bar"] } } } 

    Il existe également une forme abrégée si le schéma ne contient que le mot-clé required .

     { "type": "object", "properties": { "foo": { "type": "ssortingng" }, "bar": { "type": "ssortingng" } }, "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 aussi ê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 requirejse . Ou, en d’autres termes: si la propriété “foo” est égale à “bar”, alors la propriété “bar” est requirejse

     { "type": "object", "properties": { "foo": { "type": "ssortingng" }, "bar": { "type": "ssortingng" } }, "anyOf": [ { "not": { "properties": { "foo": { "enum": ["bar"] } }, "required": ["foo"] } }, { "required": ["bar"] } ] } 

    Si “foo” n’est pas égal à “bar”, #/anyOf/0 correspond et la validation réussit. Si “foo” est égal à “bar”, #/anyOf/0 échoue et #/anyOf/1 doit être valide pour que la validation anyOf réussisse.

    Enum

    Si votre conditionnel est basé sur un enum, c’est un peu plus simple. “foo” peut être “bar” ou “baz”. Si “foo” est égal à “bar”, alors “bar” est requirejs. Si “foo” est égal à “baz”, alors “baz” est requirejs.

     { "type": "object", "properties": { "foo": { "enum": ["bar", "baz"] }, "bar": { "type": "ssortingng" }, "baz": { "type": "ssortingng" } }, "anyOf": [ { "properties": { "foo": { "enum": ["bar"] } }, "required": ["bar"] }, { "properties": { "foo": { "enum": ["baz"] } }, "required": ["baz"] } ] } 

    If-Then-Else

    Un ajout relativement nouveau 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 requirejse

     { "type": "object", "properties": { "foo": { "type": "ssortingng" }, "bar": { "type": "ssortingng" } }, "if": { "properties": { "foo": { "enum": ["bar"] } } }, "then": { "required": ["bar"] } } 

    EDIT 12/23/2017: Mise à jour de la section Implication et ajout de la section If-Then-Else.