В зависимости от вашей ситуации существует несколько разных подходов. Я могу думать о четырех разных способах условно требовать поля.
Зависимости
dependencies
ключевого слова является условным изменением required
ключевого слова. Свойство Foreach в dependencies
, если свойство присутствует в проверяемом JSON, то также должна быть действительна схема, связанная с этим ключом. Если свойство «Foo» присутствует, то свойство «бар» требуется
{
"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» равно «бар», то свойство «бар» требуется
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"anyOf": [
{
"not": {
"properties": {
"foo": { "enum": ["bar"] }
},
"required": ["foo"]
}
},
{ "required": ["bar"] }
]
}
Если «Foo» не равно «бар», #/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": { "enum": ["bar"] }
},
"required": ["bar"]
},
{
"properties": {
"foo": { "enum": ["baz"] }
},
"required": ["baz"]
}
]
}
If-Then-Else
Относительно новое дополнение к JSON Schema (проект-07) добавляет if
, then
и else
ключевые слова. Если свойство "Foo" равно "бар", то свойство "бар" требуется
{
"type": "object",
"properties": {
"foo": { "type": "string" },
"bar": { "type": "string" }
},
"if": {
"properties": {
"foo": { "enum": ["bar"] }
}
},
"then": { "required": ["bar"] }
}
EDIT 12/23/2017: Причастность раздел обновляется и If-Then-Else добавлен раздел.
Да, это должно быть возможно. Какая информация в данных вызовет обязательность? – jruizaranguren
Как это сделать с версией 3? –
@SarveswaranMeenakshiSundaram - Я не знаю, что я использовал v4 схемы json. –