Я думаю, что у вас такая же проблема, как в этот вопрос .
@ Relequestual прав в том, что вам нужно ключевое слово properties
вокруг вашей выноски SDK
. Но для того, что вы хотите сделать, вам нужно реорганизоваться.
Подсхемы работают только на своем уровне в экземпляре, а не в корне.
Рассмотрим эту схему для простого экземпляра объекта JSON, содержащего one
и свойство two
:
{
"properties": {
"one": {
"enum": ["yes", "no", "maybe"]
},
"two": {
"if": {
"properties": {
"one": {"const": "yes"}
}
},
"then": {
... // do some assertions on the two property here
},
"else": {
...
}
}
}
}
Ключевое слово if
в свойстве two
может рассматривать только часть экземпляра в свойстве two
(т.е. значение two
). Он не смотрит на корень экземпляра, поэтому вообще не видит свойства one
.
Чтобы подсхема в подсхеме свойства two
могла видеть свойство one
в экземпляре, необходимо переместить if
за пределы ключевого слова properties
.
{
"if": {
"properties": {
"one": {"const" : "yes"}
}
},
"then": {
... // do some assertions on the two property here
},
"else": {
... // assert two here, or have another if/then/else structure to test the one property some more
}
}
Для двух возможных значений one
это довольно хорошо. Даже три возможных значения неплохо. Однако с увеличением возможных значений one
увеличивается и вложенность if
с, что может сделать вашу схему ужасной для чтения (и, возможно, замедлить проверку).
Вместо использования конструкции if
/ then
/ else
я предлагаю использовать anyOf
или oneOf
, где каждая подсхема представляет действительное состояние для экземпляра, учитывая различные значения one
.
{
"oneOf": [
{
"properties": {
"one": {"const": "yes"},
"two": ... // do some assertions on the two property here
}
},
{
"properties": {
"one": {"const": "no"},
"two": ... // do some assertions on the two property here
}
},
{
"properties": {
"one": {"const": "maybe"},
"two": ... // do some assertions on the two property here
}
}
]
}
На мой взгляд, это намного чище.
Надеюсь, это объяснение поможет вам восстановить схему, чтобы эти другие экземпляры могли пройти.