在 JSON 模式中使用对象 属性 键作为枚举
Use object property keys as enum in JSON schema
我正在尝试使用 JSON 模式验证 JSON 文件,以便找到 "broken references" 的情况。本质上,我的文件由项目和组组成,每个项目都属于由组 属性 键引用的单个组,如下所示:
{
"items": {
"banana": {
"name": "Banana",
"group": "fruits"
},
"apple": {
"name": "Apple",
"group": "fruits"
},
"carrot": {
"name": "Carrot",
"group": "vegetables"
},
"potato": {
"name": "Potato",
"group": "vegetables"
},
"cheese": {
"name": "Cheese",
"group": "dairy"
}
},
"groups": {
"fruits": {
"name": "Fruits"
},
"vegetables": {
"name": "Vegetables"
}
}
}
在上面的示例中,项目 cheese
被视为无效,因为 groups
对象中没有 dairy
属性。我尝试使用以下架构对此进行验证:
{
"$schema": "http://json-schema.org/draft-06/schema#",
"title": "Food",
"id": "food",
"type": "object",
"properties": {
"items": {
"type": "object",
"patternProperties": {
"^[A-Za-z0-9-_.:=]+$": {
"properties": {
"name": {
"type": "string",
"pattern": "^[A-Za-z- ]+$"
},
"group": {
"pattern": "^[a-z]+$",
"enum": {
"$data": "/groups"
}
}
}
}
}
},
"groups": {
"type": "object",
"patternProperties": {
"^[A-Za-z0-9-_]+$": {
"properties": {
"name": {
"type": "string",
"pattern": "^[A-Za-z- ]+$"
}
}
}
}
}
},
"additionalProperties": false
}
这样的效果是 group
的 enum
由 groups
中的 属性 值填充,但我想做的是使用 属性 keys 定义在groups
.
如果我添加一个 属性,例如groupIds
并让它成为在 groups
中找到的所有 属性 键的数组并将枚举指定为 "$data": "/groupIds"
它确实有效,所以我认为这是一个 JSON指针问题。
JSON 架构中的 enum
关键字定义为:
The value of this keyword MUST be an array. This array SHOULD have at least one element. Elements in the array SHOULD be unique.
所以如果我只能得到 JSON 指针来引用对象的键而不是它的值,我想枚举验证就可以了。我在想 "$data": "/groups/.keys"
、"$data": "/groups/$keys"
或类似的东西,但在谷歌搜索或阅读规范时没有找到它。有没有这样的事情或者有人提出过?
没有这样的事情。它非常接近JSON中的通用表达式,它可能有一些用例,但没有这样的规范。
我正在尝试使用 JSON 模式验证 JSON 文件,以便找到 "broken references" 的情况。本质上,我的文件由项目和组组成,每个项目都属于由组 属性 键引用的单个组,如下所示:
{
"items": {
"banana": {
"name": "Banana",
"group": "fruits"
},
"apple": {
"name": "Apple",
"group": "fruits"
},
"carrot": {
"name": "Carrot",
"group": "vegetables"
},
"potato": {
"name": "Potato",
"group": "vegetables"
},
"cheese": {
"name": "Cheese",
"group": "dairy"
}
},
"groups": {
"fruits": {
"name": "Fruits"
},
"vegetables": {
"name": "Vegetables"
}
}
}
在上面的示例中,项目 cheese
被视为无效,因为 groups
对象中没有 dairy
属性。我尝试使用以下架构对此进行验证:
{
"$schema": "http://json-schema.org/draft-06/schema#",
"title": "Food",
"id": "food",
"type": "object",
"properties": {
"items": {
"type": "object",
"patternProperties": {
"^[A-Za-z0-9-_.:=]+$": {
"properties": {
"name": {
"type": "string",
"pattern": "^[A-Za-z- ]+$"
},
"group": {
"pattern": "^[a-z]+$",
"enum": {
"$data": "/groups"
}
}
}
}
}
},
"groups": {
"type": "object",
"patternProperties": {
"^[A-Za-z0-9-_]+$": {
"properties": {
"name": {
"type": "string",
"pattern": "^[A-Za-z- ]+$"
}
}
}
}
}
},
"additionalProperties": false
}
这样的效果是 group
的 enum
由 groups
中的 属性 值填充,但我想做的是使用 属性 keys 定义在groups
.
如果我添加一个 属性,例如groupIds
并让它成为在 groups
中找到的所有 属性 键的数组并将枚举指定为 "$data": "/groupIds"
它确实有效,所以我认为这是一个 JSON指针问题。
JSON 架构中的 enum
关键字定义为:
The value of this keyword MUST be an array. This array SHOULD have at least one element. Elements in the array SHOULD be unique.
所以如果我只能得到 JSON 指针来引用对象的键而不是它的值,我想枚举验证就可以了。我在想 "$data": "/groups/.keys"
、"$data": "/groups/$keys"
或类似的东西,但在谷歌搜索或阅读规范时没有找到它。有没有这样的事情或者有人提出过?
没有这样的事情。它非常接近JSON中的通用表达式,它可能有一些用例,但没有这样的规范。