additionalProperties
не может "видеть сквозь" аппликаторы, такие как allOf
, и при этом он не может "видеть сквозь" использование $ref
.
Чтобы исправить это, вы должны сделать НЕКОТОРОЕ дублированиевашей схемы в вашей самой внешней / самой верхней схеме и удалите требование additionalProperties: false
из любых дочерних схем.
additionalProperties: false
работает, применяя false
(которая является допустимой схемой, которая возвращает ошибку проверки) значениям, которые не совпадают с ключами на основе properties
или patternProperties
в пределах одного и того же объекта схемы.
Проверка с помощью «AdditionalProperties» применяется только к дочерним
значениям имен экземпляров, которыене совпадают никакие имена в "свойствах" и не совпадают ни с одним регулярным выражением в "patternProperties".
https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5.6 (draft-7)
Итак,если вам нужно скопировать все нужные вам свойства в схему верхнего уровня. Да, это нехорошо!
Вы можете сделать это немного лучше, заметив тот факт, что значения объекта properties
являются схемами, и поэтому могут быть просто true
, позволяя дочерним схемамна самом деле сделайте проверку позже.
Вот пример, который я собираюсь использовать в предстоящем выступлении:
{
"$schema": "http://json-schema.org/draft-07/schema",
"title": "MatchMakerExchange format for queries",
"definitions": {
"phenotypicFeatures": {
"type": [
"array"
]
},
"genomicFeatures": {
"type": [
"array"
]
},
"geneticsPatient": {
"properties": {
"phenotypicFeatures": {
"$ref": "#/definitions/phenotypicFeatures"
},
"genomicFeatures": {
"$ref": "#/definitions/genomicFeatures"
}
},
"anyOf": [
{
"required": [
"phenotypicFeatures"
]
},
{
"required": [
"genomicFeatures"
]
}
]
},
"regularPatient": {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": [
"string"
]
}
}
}
},
"properties": {
"patient": {
"additionalProperties": false,
"properties": {
"name": true,
"phenotypicFeatures": true,
"genomicFeatures": true
},
"allOf": [
{
"$ref": "#/definitions/regularPatient"
},
{
"$ref": "#/definitions/geneticsPatient"
}
]
}
}
}
Вы вполне можете спросить ... "Ну, этосумасшедший. Вы можете это исправить, пожалуйста? - Мы сделали. Он называется черновик 2019-09
, и только недавно был выпущен, так что вам придется ждать, пока реализации догонят.
Новое ключевое слово unevaluatedProperties
зависит от результатов аннотации, но вам все равно нужно удалить additionalProperties: false
из дочерних схем.