【发布时间】:2021-10-14 18:10:29
【问题描述】:
我有一个 JSON 模式,在模式中 - 当属性 type 等于 menu 时,属性 default 应该是一个整数或称为“默认”的字符串。问题是,架构会引发警告/错误,即 default 属性应该是整数,即使 type 不是“菜单”也是如此。
(JSON 中有名为“type”和“default”的属性,不要与 JSON 模式类型和默认键混淆)。
Schema 缩减为相关属性:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "array",
"title": "HubSpot Module",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "The type of field, see [field types](https://developers.hubspot.com/en/docs/cms/building-blocks/module-theme-fields#field-types) for documentation on all field types."
},
"default": {
"type": ["string", "integer", "array", "boolean", "null", "number", "object"],
"description": "Default value for the field.",
"if": {
"properties": {
"type": {
"const": "menu"
}
}
},
"then": {
"anyOf": [
{
"type": "integer"
},
{
"type": "string",
"enum": [
"default"
]
}
],
"description": "The menu ID for the menu. The default value of null, defaults to the default menu under navigation.",
"default": "null"
},
"else": {
"anyOf": [
{
"type": ["string", "integer", "array", "boolean", "null", "number", "object"]
}
]
}
}
},
"required": [
"name",
"label",
"type"
]
}
}
当满足这些条件时它会起作用,例如
[
{
"label": "Primary menu field",
"name": "primary_menu_field",
"type": "menu",
"default": 123
}
]
[
{
"label": "Primary menu field",
"name": "primary_menu_field",
"type": "menu",
"default": "default"
}
]
这些都不会引发警告。但是以下会引发警告:Incorrect type. Expected "integer".
[
{
"name": "boolean_field",
"label": "Boolean field",
"required": false,
"locked": false,
"type": "boolean",
"inline_help_text": "",
"help_text": "",
"default": false
}
]
尽管type 属性没有被命名为“菜单”。将鼠标悬停在“默认”属性 VSCode 上确实给了我对它的定义。
似乎if 语句总是被评估为真 - 只有当属性 type 的值是 menu 时才应该评估它,我有什么遗漏吗?
【问题讨论】:
标签: json jsonschema