Схема JSON не использует объектно-ориентированную парадигму, поэтому такие понятия, как наследование, плохо транслируются.Схема JSON представляет собой набор ограничений.Это субтрактивный, а не аддитивный, как большинство людей привыкли.Это означает, что для пустой схемы набор допустимых документов JSON является набором всех документов JSON.При добавлении ключевых слов вы вычитаете из набора допустимых документов JSON.Как только что-то удалено из набора, оно не может быть добавлено обратно.
Таким образом, вы можете использовать композицию для «расширения» схемы, но вы никогда не сможете «переопределить» то, что определяет другая схема.
/ схема / база
{
"type": "object",
"properties": {
"foo": { "type": "string" }
"bar": { "type": "string" }
}
}
/ схема / расширенная
{
"allOf": [{ "$ref": "/schema/base" }],
"properties": {
"baz": { "type": "string" }
}
}
Здесь было простое расширение, котороепрекрасно работает со схемой JSON.
/ schema / override
{
"allOf": [{ "$ref": "/schema/base" }],
"properties": {
"bar": { "type": "integer" },
"baz": { "type": "boolean" }
}
}
В этом примере обе схемы имеют поле /properties/bar
.Если вы думаете об этом с точки зрения наследования, вы неправильно поймете, что здесь происходит.В этом случае оба поля"/ properties / bar" должны быть действительными.Нет конфликта для разрешения.Как говорит ключевое слово, «все» схемы должны быть действительными.
Надеемся, что это даст вам достаточно информации, чтобы решить вашу проблему и избежать наиболее распространенных ошибок.