/ / Répétition de modèle JSON-Schema à l'intérieur du tableau - json, validation, jsonschema

Répétition de modèle JSON-Schema dans un tableau - json, validation, jsonschema

Existe-t-il un moyen de créer un modèle de répétition pour les éléments à l'intérieur du tableau d'un document de schéma JSON. Je voudrais l'utiliser pour valider la requête produite par un outil de création de requêtes.

la partie du schéma que j'utilise actuellement est

"complexCondition": {
"anyOf": [
{
"title": "Simple condition, e.x. X==0",
"type": "string"
},
{
"type": "array",
"items": [
{
"$ref": "#/complexCondition"
},
{
"type": "string", "enum": ["AND","OR"]
},
{
"$ref": "#/complexCondition"
}
],
"additionalItems": false
}
]
}

Cela me permet de valider correctement la requête "conditionA && conditionB && conditionC" comme

[[conditionA,"AND",conditionB],"AND",conditionC]

Cependant, je voudrais pouvoir et valider les documents où la requête est stockée en tant que

[conditionA,"AND",conditionB,"AND",conditionC]

et ceci est réalisable pour n'importe quel nombre de conditions.

Réponses:

0 pour la réponse № 1

Afin de réaliser ce que vous avez l'intention de faire, vous devez définir une règle pour les positions paires et impaires. dans un tableau, ce qui ne peut pas être fait pour les tableaux de toute longueur avec json-schema.

Si le nombre attendu de conditions de requête ne va pas augmenter à l'infini, vous pouvez coder en dur les n premières positions dans le mot clé des éléments:

"items": [{"$ ref": "# / condition}, {" $ ref ":" # / operator "}, {" $ ref ":" # / condition}, {"$ ref": "# / opérateur "} ... etc.]

Dans ce cas, vous avez toujours le problème que vouspourrait définir une condition erronée se terminant par "opérateur". Une autre option serait de créer "oneOf" et de construire chaque posibilité (cela pourrait être automatisé avec un script, je suppose que vous n'aurez pas d'expressions avec 100 clauses ...)

Quoi qu'il en soit, je trouve un peu étrange d'essayer d'aplatir un concept intrinsèquement récursif. Comment conserveriez-vous cela ((A OU B) OU (C ET B))?

Donc, si vous pouvez toujours repenser votre format de schéma de sérialisation souhaité, je vous suggérerais de faire une approche récursive. Quelque chose comme:

"predicate" : {
"type" : "array",
"items" : {
"$ref" : "#/clause"
}
}

"clause" : {
"type" : "array",
"items" : [{
"$ref" : "#/condition"
}
],
"additionalItems" : {
"type" : "array",
"items" : [{
"$ref" : "#/operator"
}, {
"$ref" : "#/clause"
}
]
}
}

La chaîne générée est plus moche, mais son analyse serait assez facile avec une simple fonction récursive:

Condition simple:

[["condition1"]]

Clause simple:

[["condition1",["OR",["condition2"]]]

Ajouter une clause au même niveau

[["condition1",["OR",["condition2"]],["OR",["condition3"]]]

Ajouter une clause à un niveau enfant

[["condition1",["OR",["condition2"]],["OR",["condition3", ["AND",["condition4"]]]]]