[РЕДАКТИРОВАНИЕ - СМОТРИ ТРЕТЬЕ РЕШЕНИЕ НИЖЕ]
Решение 1 - Хотя бы один, но не оба (подробный)
Я бы добавил allOf
с a nested oneOf
:
{
...
"allOf": [
{
"oneOf": [
{"required": ["field_2"]},
{"required": ["field_3"]}
],
},
{
"not": {
"required": ["field_2", "field_3"]
}
}
],
...
}
Для этого требуется наличие одного из двух полей, но не обоих.
Решение 2 - Как минимум одно, но не оба
Я думаю, что это можно еще больше упростить, используя только oneOf
:
{
...
"oneOf": [
{"required": ["field_2"]},
{"required": ["field_3"]}
],
...
}
- Если ни того, ни другого нет, то оба они потерпят неудачу, а
oneOf
не удастся. - Если кто-то есть, то проходит
oneOf
. - Если оба присутствуют, оба они пройдут, и
oneOf
завершится неудачей.
Да, так лучше. Глядя на то, что у вас было, я думаю, что это то, что вы пытались сделать, поэтому вы были действительно близко!
Решение 3 - Максимум один
Чтобы пройти, когда нет ни одного поля, вам нужно первое решение, но замените allOf
на anyOf
:
{
...
"anyOf": [
{
"oneOf": [
{"required": ["field_2"]},
{"required": ["field_3"]}
],
},
{
"not": {
"required": ["field_2", "field_3"]
}
}
],
...
}
- Если ни того, ни другого нет, тогда подсхема
not
пройдет и anyOf
проходит. - Если кто-то есть, то подсхема
oneOf
пройдет, и пройдет anyOf
. - Если оба присутствуют, то
- обе подсхемы
oneOf
пройдут, поэтому oneOf
завершится неудачей not
подсхема завершится неудачей - , поэтому
anyOf
завершится неудачей
Вы можете протестировать эти решения здесь