Существуют разные подходы к достижению такого поведения. Один из них использует условные аппликаторы на месте, которые доступны с JSON Schema Draft 7. Синтаксис выглядит следующим образом (для ясности я извлечу задействованную подсхему):
{
"type": "object",
"required": [
"Mytype",
"filename",
"compression"
],
"properties": {
"Mytype": {
"type": "string"
},
"filename": {
"type": "string"
},
"compression": {
"type": "string"
}
},
"if": {
"properties": {"Mytype": {"const": "abc"}}
},
"then": {
"properties": {"filename": {"const": "tutor.txt"}}
}
}
Следующее JSON документ действителен для этой JSON Схема:
{
"Mytype": "abc",
"filename": "tutor.txt",
"compression": "foo"
}
И это будет недействительно :
{
"Mytype": "abc",
"filename": "tutor",
"compression": "foo"
}
Для более сложных условий JSON Схема предоставляет ключевое слово "else"
. Чтобы узнать больше, я предлагаю вам проверить этот учебный справочник в разделе Условное применение подсхем .
В дополнение к этому условному подходу вы можете express та же самая грамматика с использованием аппликаторов логических логических c вместо условных аппликаторов, показанных выше. Лично я, хотя обычно более подробный, я предпочитаю это решение, поскольку оно представляет собой чисто декларативное решение вместо этого «процедурного» * 1019 * понятия, которое в конце концов остается более ясным.
Вот пример:
{
"type": "object",
"required": [
"Mytype",
"filename",
"compression"
],
"oneOf": [
{
"properties": {
"Mytype": {
"const": "abc"
},
"filename": {
"const": "tutor.txt"
},
"compression": {
"type": "string"
}
}
},
{
"properties": {
"Mytype": {
"not": {
"const": "abc"
}
},
"filename": {
"type": "string"
},
"compression": {
"type": "string"
}
}
}
]
}
Пояснение: документ JSON должен быть действителен для только одной из подсхем, включенных в "oneOf"
. Первый выражает ограниченный регистр, обязывающий "filename"
быть "tutor.txt"
, если "Mytype"
равно "abc"
. Вторая подсхема представляет случай, когда "Mytype"
равно , а не "abc"
, поэтому "filename"
не ограничивается, просто любое "string"
.
Как указано, логическое логическое значение Синтаксис c аппликаторов дает более подробные схемы, и им может потребоваться некоторое время, чтобы привыкнуть к ним, но в целом, на мой взгляд, они являются лучшим вариантом.