Да, применяется тот же подход. Вам просто нужно вложить схемы немного глубже.
{
"type": "object",
"properties": {
"os": { "enum": ["macOs", "windows"] },
"specs": {
"macModel": { "enum": ["macbook air", "macbook pro", "macbook"] },
"memory": { "type": "number" }
}
},
"allOf": [{ "$ref": "#/definitions/os-macOs-requires-macModel" }],
"definitions": {
"os-macOs-requires-macModel": {
"anyOf": [
{ "not": { "$ref": "#/definitions/os-macOs" } },
{ "$ref": "#/definitions/requires-macModel" }
]
},
"os-macOs": {
"properties": {
"os": { "const": "macOs" }
},
"required": ["os"]
},
"requires-macModel": {
"properties": {
"specs": {
"required": ["macModel"]
}
}
}
}
}
Обратите внимание, что в схеме /definitions/requires-macModel
необходимо найти свойство "specs" и поместить туда required
вместо верхнего уровня, как в плоском случае.
Я использовал шаблон следствия для этого примера, но тот же подход можно использовать с if
- then
, если вы предпочитаете этот подход и имеете доступ к валидатору draft-07.