В вашей profiles.items
схеме вы определили additionalProperties: false
.
additionalProperties
, зависит от properties
, определенного в том же объекте схемы, что означает, что color
всегда будет запрещен.
Вы можете разделить свои опасения на «какие свойства разрешены» и «если их значения действительны».
Перемещение проверки для объекта color
в profiles.properties
позволяет поддерживать additionalProperties: false
на уровне этого объекта.
Значения схемы объекта properties
применяются только к расположению экземпляра для ключей, если они существуют (следовательно, необходимо использовать required
, чтобы требовать указание c ключи ... требуются).
Упростив условный раздел, вы получите более чистую схему.
Теперь вам нужно только определить условие, при котором color
требуется, не беспокоясь о том, как должно выглядеть значение.
Код Sudo: если key
равно customLink
, тогда требуется color
, в противном случае не указывайте color
.
{
"if": {
"properties": {
"key": {
"const": "customLink"
}
}
},
"then": {
"required": [
"color"
]
},
"else": {
"not": {
"required": [
"color"
]
}
}
}
Используя not
, вы можете инвертировать результат проверки прикладной подсхемы, это то, что вам нужно сделать, если вы хотите определить, что указанное свойство c НЕ разрешено.
Вот живая демонстрация, с которой можно поиграть: https://jsonschema.dev/s/C9V6N
А для процветания, вот полная схема с удалением одной или двух избыточностей.
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"data"
],
"additionalProperties": false,
"properties": {
"type": {
"type": "string",
"enum": [
"social_media_profiles"
]
},
"data": {
"type": "object"
}
},
"allOf": [
{
"properties": {
"data": {
"type": "object",
"required": [
"profiles"
],
"additionalProperties": false,
"properties": {
"profiles": {
"type": "array",
"items": {
"type": "object",
"required": [
"data",
"field",
"key"
],
"additionalProperties": false,
"properties": {
"data": {
"type": "string",
"description": "Data contains either profile url, handle id, etc."
},
"field": {
"type": "string",
"enum": [
"url",
"handle",
"id",
"tel"
],
"description": "Type of field value."
},
"key": {
"type": "string",
"description": "Social media name used to distinguish each social network"
},
"label": {
"type": "string",
"description": "Label to display on the landing page"
},
"color": {
"type": "object",
"additionalProperties": false,
"properties": {
"button": {
"type": "string"
},
"text": {
"type": "string"
},
"border": {
"type": "string"
}
}
}
},
"allOf": [
{
"if": {
"properties": {
"key": {
"const": "customLink"
}
}
},
"then": {
"required": [
"color"
]
},
"else": {
"not": {
"required": [
"color"
]
}
}
}
]
}
}
}
}
}
}
]
}
}