/ / Opakovanie vzoru JSON-Schema vo vnútri poľa - json, validácia, jsonschema

Opakovanie vzoru JSON-Schema vo vnútri poľa - json, validácia, jsonschema

Existuje spôsob, ako vytvoriť opakujúci sa vzor pre prvky vnútri poľa dokumentu JSON Schema. Chcel by som ho použiť na overenie dopytu vytvoreného nástrojom na tvorbu dopytov.

časť schémy, ktorú momentálne používam, je

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

To mi umožňuje správne overenie otázky "

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

Chcel by som však byť schopný a overiť dokumenty, v ktorých je dotaz uložený ako

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

a to dosiahnuteľné za akýchkoľvek podmienok.

odpovede:

0 pre odpoveď č. 1

Aby ste dosiahli to, čo máte v úmysle urobiť, musíte definovať pravidlo pre nepárne a párne pozície v poli, ktoré nie je možné vykonať pre polia ľubovoľnej dĺžky so schémou json.

Ak očakávaný počet podmienok dopytu nebude rásť ad nekonečno, môžete pevne kódovať prvých n pozícií v kľúčových slovách položiek:

"Položky": [{ "$ ref": "# / stav}, {" $ ref ":" # / prevádzkovateľ "}, {" $ ref ":" # / stav}, { "$ ref": "# / operátor "} ... atď]

V tomto prípade máte stále problémmohol definovať nesprávny stav končiaci na „operátor“. Ďalšou možnosťou by bolo vytvorenie „oneOf“ a vytvorenie každej možnosti (toto by sa dalo automatizovať pomocou skriptu, myslím, že ste nevyhrali výrazy so 100 klauzulami ...)

Každopádne sa mi zdá trochu čudné pokúsiť sa vyrovnať koncept, ktorý je prirodzene rekurzívny. Ako by ste to uložili ((A ALEBO B) ALEBO (C A B))?

Ak teda stále dokážete prehodnotiť požadovaný formát schémy serializácie, navrhujem, aby ste sa rozhodli rekurzívne. Niečo ako:

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

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

Generovaný reťazec je škaredší, ale jeho jednoduchá rekurzívna funkcia by bola pomerne jednoduchá:

Jednoduchá podmienka:

[["condition1"]]

Jednoduchá klauzula:

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

Pridanie klauzuly na rovnakej úrovni

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

Pridajte klauzulu na podradenú úroveň

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