В зависимости от вашей ситуации есть несколько разных подходов. Я могу придумать четыре разных способа условного требования поля.
Зависимости
dependencies
Ключевым словом является условным изменением required
ключевого слова. Свойство Foreach в dependencies
, если свойство присутствует в проверяемом JSON, то схема, связанная с этим ключом, также должна быть действительной. Если свойство "foo" присутствует, то свойство "bar" обязательно.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": { "required": ["bar"] }
}
}
Также существует краткая форма, если схема содержит только required
ключевое слово.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"dependencies": {
"foo": ["bar"]
}
}
Последствия
Если ваше условие зависит от значения поля, вы можете использовать концепцию логической логики, называемую импликацией. «A подразумевает B» эффективно означает, что если A истинно, то B также должно быть истинным. Следствие также может быть выражено как «! A или B». Либо свойство «foo» не равно «bar», либо свойство «bar» является обязательным . Или, другими словами: если свойство "foo" равно "bar", тогда свойство "bar" обязательно.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
Если «foo» не равно «bar», #/anyOf/0
совпадения и проверка пройдены успешно. Если «foo» равно «bar», #/anyOf/0
не выполняется и #/anyOf/1
должно быть действительным для anyOf
успешной проверки.
Enum
Если ваше условное выражение основано на перечислении, это немного проще. «foo» может быть «bar» или «baz». Если «foo» равно «bar», тогда «bar» является обязательным. Если «foo» равно «baz», то «baz» является обязательным.
{
"type": "object",
"properties": {
"foo": { "enum": ["bar", "baz"] },
"bar": { "type": "string" },
"baz": { "type": "string" }
},
"anyOf": [
{
"properties": {
"foo": { "const": "bar" }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "const": "baz" }
},
"required": ["baz"]
}
]
}
Если-то-еще
Относительно новое дополнение к схеме JSON (draft-07) добавляет ключевые слова if
, then
и else
. Если свойство "foo" равно "bar", тогда свойство "bar" обязательно.
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "const": "bar" }
},
"required": ["foo"]
},
"then": { "required": ["bar"] }
}
РЕДАКТИРОВАТЬ 23.12.2017: обновлен раздел о последствиях и добавлен раздел If-Then-Else.
РЕДАКТИРОВАТЬ 06/04/2018: Исправление ошибки для If-Then-Else и обновление синглтонов enum
для использования const
.