Кажется, я не могу найти работающий способ применения логики if / then к перечислению.
anyOf
не применяет условную логику, а вместо этого говорит, что если какой-либо из них соответствует, то это хорошо.
allOf
снова не применяет условную логику, но проверяет расширенный набор свойств / обязательных полей.
Вот пример схемы JSON:
{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"title": "The Root Schema",
"required": [
"type"
],
"properties": {
"type": {
"$id": "#/properties/type",
"enum": [
"a",
"b",
"c"
],
"title": "The Type"
},
"options": {
"$id": "#/properties/options",
"type": "object",
"title": "The Options Schema",
"oneOf": [
{
"if": { "properties": { "type": { "const": "a" } }
},
"then": {
"required": [ "option1" ],
"properties": {
"option1": {
"$id": "#/properties/options/properties/option1",
"type": "boolean",
"title": "The option1 Schema"
}
}
}
},
{
"if": { "properties": { "type": { "const": "b" } }
},
"then": {
"required": [ "option2" ],
"properties": {
"option2": {
"$id": "#/properties/options/properties/option2",
"type": "boolean",
"title": "The option2 Schema"
}
}
}
},
{
"if": { "properties": { "type": { "const": "c" } }
},
"then": {
"required": [],
"properties": {}
}
}
]
}
}
}
Если выпроверить по этому JSON:
{
"type": "a",
"options": {
"option1": true
}
}
Сбой, потому что требуется option2
.
Если вы измените его на anyOf
, то это будет успешно, но если вы измените JSON на недействительный:
{
"type": "a",
"options": {
"option2": false
}
}
Это все еще успешно.
Мне не удалось получить вложенность, если / then / else / if / then / else работает либо.
Как мне выполнитьпроверка, где у меня есть набор свойств для каждого type
, и вы не можете смешивать их?Это действительно возможно, или я должен просто изменить свой дизайн.