Залежно від вашої ситуації існує кілька різних підходів. Я можу придумати чотири різні способи умовно вимагати поля.
Залежності
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" дорівнює "бар", #/anyOf/0
не вдається і #/anyOf/1
повинен бути дійсним дляanyOf
успішної перевірки.
Перелік
Якщо ваш умовний заснований на перерахуванні, це трохи більш прямо. "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 Schema (проект-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: Розділ "Наслідки" оновлено та додано розділ "Якщо потім".
РЕДАГУВАТИ 06.04.2018: Виправлення для If-Then-Else та оновлення одиночних enum
s для використання const
.