Вообще говоря, этот вопрос уже имеет удивительный обобщенный c ответ здесь .
При этом, возможно, вы сможете улучшить свою структуру данных в отношении "DayActivity"
, что также облегчит формулировку соответствующей JSON схемы.
Ваш "DayActivity"
в настоящее время является массивом объектов, каждый из которых содержит до трех свойств одновременно: "PhysicalActivity"
/ "StudyActivity"
/ "ArtActivity"
. Как насчет чего-то подобного следующему, вместо этого это позволяет только одному из трех свойств присутствовать в одном элементе массива:
"DayActivity": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"oneOf": [
{
"properties": {
"PhysicalActivity": {
"type": "string",
"enum": ["Walking", "Running"]
}
},
"required": ["PhysicalActivity"]
},
{
"properties": {
"StudyActivity": {
"type": "string",
"enum": ["Maths Class", "Science Class"]
}
},
"required": ["StudyActivity"]
},
{
"properties": {
"ArtActivity": {
"type": "string",
"enum": ["Drawing", "Dance"]
}
},
"required": ["ArtActivity"]
}
]
},
"contains": {
"required": ["PhysicalActivity"]
}
}
Обратите внимание на ключевое слово "contains"
в конце, чтобы гарантировать, что всегда нужно быть хотя бы одной записью "PhysicalActivity"
в массиве "DayActivity"
.
Если вы теперь хотите условно применять "StudyActivity"
в каждый день недели, но "SUNDAY"
, вы можете добавить следующее в основную схему ( то есть на верхнем уровне, где объявляется "properties": { "DayHeader": ... }
:
"oneOf": [
{
"properties": {
"DayHeader": {
"properties": {
"Day": {
"const": "SUNDAY"
}
}
}
}
},
{
"properties": {
"DayHeader": {
"properties": {
"Day": {
"enum": [
"MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"
]
}
}
},
"ActivityDetail": {
"properties": {
"DayActivity": {
"contains": {
"required": ["StudyActivity"]
}
}
}
}
}
}
]
Полная схема может выглядеть примерно так:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["DayHeader", "ActivityDetail"],
"properties": {
"DayHeader": {
"type": "object",
"properties": {
"Day": {
"type": "string",
"enum": [
"SUNDAY",
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY",
"SATURDAY"
]
}
},
"required": [
"Day"
]
},
"ActivityDetail": {
"type": "object",
"required": ["DayActivity"],
"properties": {
"DayActivity": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"oneOf": [
{
"properties": {
"PhysicalActivity": {
"type": "string",
"enum": ["Walking", "Running"]
}
},
"required": ["PhysicalActivity"]
},
{
"properties": {
"StudyActivity": {
"type": "string",
"enum": ["Maths Class", "Science Class"]
}
},
"required": ["StudyActivity"]
},
{
"properties": {
"ArtActivity": {
"type": "string",
"enum": ["Drawing", "Dance"]
}
},
"required": ["ArtActivity"]
}
]
},
"contains": {
"required": ["PhysicalActivity"]
}
}
}
}
},
"oneOf": [
{
"properties": {
"DayHeader": {
"properties": {
"Day": {
"const": "SUNDAY"
}
}
}
}
},
{
"properties": {
"DayHeader": {
"properties": {
"Day": {
"enum": [
"MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"
]
}
}
},
"ActivityDetail": {
"properties": {
"DayActivity": {
"contains": {
"required": ["StudyActivity"]
}
}
}
}
}
}
]
}
Выше успешно проверяется по:
{
"DayHeader": { "Day": "SUNDAY"},
"ActivityDetail": {
"DayActivity": [
{ "PhysicalActivity": "Walking" }
]
}
}
Но не по следующему (потому что отсутствует "StudyActivity"
:
{
"DayHeader": { "Day": "WEDNESDAY"},
"ActivityDetail": {
"DayActivity": [
{ "PhysicalActivity": "Walking" }
]
}
}