В моей схеме я объявил эти свойства:
"index_name": {
"type": "string",
"examples": ["foo-wwen-live", "foo"]
},
"locale": {
"type": "string",
"examples": ["wwen", "usen", "frfr"]
},
"environment": {
"type": "string",
"default": "live",
"examples": [
"staging",
"edgengram",
"test"
]
}
Я хочу, чтобы тело JSON, проверенное по моей схеме, было действительным , только если :
index_name
присутствует присутствует, а оба locale
и environment
отсутствуют присутствует; locale
и / или enviroment
присутствует присутствует, а index_name
отсутствует присутствует
Короче говоря, locale
и environment
никогда не следует смешивать с index_name
.
Контрольные примеры и желаемые результаты:
Они должны пройти:
Дело № 1
{
"locale": "usen"
}
Дело № 2
{
"environment": "foo"
}
Дело № 3
{
"environment": "foo",
"locale": "usen"
}
Дело № 4
{
"index_name": "foo-usen"
}
Это НЕ должно пройти:
Дело № 5
{
"index_name": "foo-usen",
"locale": "usen"
}
Дело № 6
{
"index_name": "foo-usen",
"environment": "foo"
}
Дело № 7
{
"index_name": "foo-usen",
"locale": "usen",
"environment": "foo"
}
Я создал следующее правило для своей схемы, однако оно не охватывает все случаи , Например, если присутствуют и locale
, и environment
, проверка возвращает ошибку, если также присутствует index_name
, что является правильным поведением в соответствии со случаем # 7. Но если присутствует только один из locale
и environment
, он также позволяет присутствовать index_name
(ошибка в случаях № 5 и № 6).
"oneOf": [
{
"required": ["index_name"],
"not": {"required": ["locale", "environment"]}
},
{
"anyOf": [
{
"required": ["locale"],
"not": {"required": ["index_name"]}
},
{
"required": ["environment"],
"not": {"required": ["index_name"]}
}
]
}
]
Я получаю смешанную информацию о том, как работает "not": {"required": []}
объявление. Некоторые люди утверждают, что это означает, что оно запрещает присутствие чего-либо, объявленного в массиве, в отличие от идеи, которую дает синтаксис. Другое утверждение о том, что это должно быть принято именно так, как звучит: перечисленные в массиве свойства не обязательны - они могут присутствовать, но это не имеет значения, если это не так.
Помимо этого правила, мне также требуется, чтобы во всех случаях присутствовало одно несвязанное свойство, и я установил "additionalProperties": false
.
Какое правило удовлетворяет всем моим тестовым примерам?