Выражение взаимоисключающих свойств довольно просто.
"oneOf": [
{ "required": ["obj2"] },
{ "required": ["obj3"] },
{ "required": ["obj4"] }
]
Сложная часть - это ограничение "или ничего". Вы должны добавить схему к oneOf
, которая запрещает все свойства. Есть несколько способов сделать это, но я думаю, что следующее является самым чистым, если не самым простым:
"oneOf": [
{
"properties": {
"obj2": false,
"obj3": false,
"obj4": false
}
},
{ "required": ["obj2"] },
{ "required": ["obj3"] },
{ "required": ["obj4"] }
]
Альтернативой является использование dependencies
вместо oneOf
.
"dependencies": {
"obj2": { "not": { "required": ["obj3"] } },
"obj3": { "not": { "required": ["obj4"] } },
"obj4": { "not": { "required": ["obj2"] } }
}
Это гораздо меньше кода и лучше масштабируется, но не сразу понятно, что он делает или как / почему он работает (он работает, я обещаю).