Я пытаюсь создать схему, которая имеет немного другую структуру в зависимости от значений, и решила использовать черновик 07 и ajv для ее проверки.Структура, которую я пытаюсь создать, выглядит следующим образом:
"url":{
"some-random-string":{
"pattern":"somevalue",
"handler":"one-of-a-few-allowed-values",
"kwargs":{ "conditional object" with further constraints}
}
}
, шаблон необходим, и некоторые объекты kwargs
будут иметь другие необходимые ключи.Я попытался использовать серию операторов if..then в сочетании со ссылкой следующим образом:
"url": {
"type": "object",
"patternProperties": {
"^.*$": {
"properties": {
"pattern": {
"type": "string"
},
"handler": {
"type": "string",
"enum": ["val1","val2"...
]
}
},
"required": ["pattern"],
"if": {
"properties": {
"handler": {
"enum": ["val1"]
}
}
},
"then": {
"properties": {
"kwargs": {
"$ref": "#/definitions/val1"
}
}
},
"if": {
"properties": {
"handler": {
"enum": ["val2"]
}
}
},
"then": {
"properties": {
"kwargs": {
"$ref": "#/definitions/val2"
},"required":["function"]
}
},
требуемое ограничение шаблона работает, требуемое ограничение функции - нет.
Я даже пытался свернуть все операторы if-then в массив allOf с каждым набором if-then внутри одного объекта, но, похоже, это не сработало.
ссылка в настоящее время выглядит следующим образом
"val2": {
"type": ["object", "boolean"],
"properties": {
"kwargs": {
"type": "object",
"properties": {
"function": {
"type": "string"
},
"methods": {
"type": "array",
"items": {
"enum": ["GET", "PUT", "POST", "DELETE", "OPTIONS"]
}
}
}
}
}
}