2 votes

2 oneOf dans json schema : 1 requis 1 optionnel

J'ai un schéma json qui fonctionne lorsque j'utilise 2 oneOf pour 2 choix entre les champs requis. Mais je ne sais pas comment faire la même chose avec des champs optionnels.

Mon schéma:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {
      "type": "number"
    },
    "b": {
      "type": "number"
    },
    "c": {
      "type": "number"
    },
    "d": {
      "type": "number"
    },
    "e": {
      "type": "number"
    }
  },
  "required": ["a"],
  "oneOf": [
    {"required": ["b"]},
    {"required": ["c"]}
  ],
  "oneOf": [
    {"required": ["d"]},
    {"required": ["e"]}
  ]
}

Comment puis-je transformer pour rendre d et e optionnels (sans jamais les avoir tous les deux en même temps) ?

3voto

Ted Epstein Points 1234

Voici un gist avec ma solution, montré dans http://jsonschemalint.com. (Outil très pratique!)

Les propriétés d et e sont déjà définies, et autorisées (mais pas requises) dans n'importe quelle combinaison. Pour rendre ces deux propriétés mutuellement exclusives, nous disons que l'instance ne doit pas correspondre à un schéma qui a à la fois les deux propriétés :

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {"type": "number"},
    "b": {"type": "number"},
    "c": {"type": "number"},
    "d": {"type": "number"},
    "e": {"type": "number"}
  },
  "required": ["a"],
  "oneOf": [
      {"required": ["b"]},
      {"required": ["c"]}
    ],
  "not" : {"required" : ["d","e"]}
}

Cela fonctionne bien, mais cela devient compliqué si vous avez plus de deux propriétés dans votre groupe mutuellement exclusif. Par exemple, si nous voulions ajouter la propriété f et la rendre mutuellement exclusive par rapport à d et e, nous devrions interdire trois combinaisons distinctes :

  "not" : {
    "anyOf"{
      {"required" : ["d","e"]},
      {"required" : ["d","f"]},
      {"required" : ["e","f"]},
    }
  }

Voici une alternative qui est plus verbeuse, mais s'adapte à des ensembles plus importants de propriétés mutuellement exclusives :

  "oneOf" : [
    {"required" : ["d"]},
    {"required" : ["e"]},
    {"required" : ["f"]},
    {
      "not" : {
        "anyOf" : [
          {"required" : ["d"]},
          {"required" : ["e"]},
          {"required" : ["f"]}
        ]
      }  
    }
  ]

Chaque propriété ajoutée au groupe nécessite exactement deux lignes.

Comme notre schéma a maintenant deux contraintes oneOf, nous devons les combiner en utilisant allOf :

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "properties": {
    "a": {"type": "number"},
    "b": {"type": "number"},
    "c": {"type": "number"},
    "d": {"type": "number"},
    "e": {"type": "number"},
    "f": {"type": "number"}
  },
  "required": ["a"],
  "allOf": [
    {
      "oneOf": [
          {"required": ["b"]},
          {"required": ["c"]}
        ]
    },
    {
      "oneOf" : [
        {"required" : ["d"]},
        {"required" : ["e"]},
        {"required" : ["f"]},
        {
          "not" : {
            "anyOf" : [
              {"required" : ["d"]},
              {"required" : ["e"]},
              {"required" : ["f"]}
            ]
          }  
        }
      ]
    }
  ]
}

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