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"]}
]
}
}
]
}
]
}