171 votes

Attribut jsonSchema requis de manière conditionnelle

Dans jsonSchema, vous pouvez indiquer si les champs définis sont obligatoires ou n'utilisent pas l'attribut "required":

 {
    "$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 souhaiterais que le champ messageVersion ne soit pas obligatoire. Existe-t-il un moyen de rendre obligatoire l’obligation de ce champ?

435voto

Jason Desrosiers Points 6705

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X