您如何扩展 json 架构元架构以支持新属性?
How do you extend json schema meta schema to support new properties?
我想在允许类型的 json 架构文档中的任何位置允许 $role 属性。从理论上讲,我应该能够如下扩展它,其中我对 json 模式元模式和我的 $role 扩展执行 allOf,其中包括 additionalProperties 以递归地获取我的扩展元模式。我发现我得到了对顶级 $role 的验证,但没有得到任何嵌入式 $role 的验证。我错过了什么吗?有没有其他方法我应该扩展 JSON 模式元模式?
我尝试了很多不同的验证器,但它们都无法验证示例中的第二个 $role。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"role": {
"type": "string",
"pattern": "^((lg)|(unionType\([a-zA-Z][a-zA-Z0-9.]*\)))$"
},
},
"allOf": [
{
"$ref": "http://json-schema.org/draft-07/schema#"
},
{
"properties": {
"additionalProperties": {
"$ref": "#"
},
"$role": {
"oneOf": [
{
"$ref": "#/definitions/role"
},
{
"type": "array",
"items": {
"$ref": "#/definitions/role"
}
}
]
}
}
}
]
}
使用此架构的示例:
{
"$schema": "schema.json",
"title": "Prompt",
"$role": "unionType(Microsoft.IPrompt)",
"properties": {
"prompt": {
"type": "string",
"$role":"foo"
}
}
}
我期望的是,根据架构,第二个角色应该是无效的。我得到的是它是有效的,即使它与 $role 模式不匹配。第一个 $role 验证成功。
是的,扩展元模式比看起来要复杂得多。查看 JSON Hyper-Schema meta schema 以获取有关如何扩展元模式的示例。 JSON Hyper-Schema 添加了两个关键字:base
和`links。扩展模式时,您需要重新定义原始模式中使用的任何递归引用。
JSON 模式(包括元模式)是不可变的。您不能有选择地修改现有架构。您的元模式仅验证 $role
关键字,所有其他关键字均由 draft-07 元模式验证。因为您的元架构不修改 draft-07 架构,所以像 properties
这样的关键字完全在 draft-07 架构的上下文中进行验证,并且不知道您在另一个架构中添加的新关键字。
不幸的是,扩展模式涉及如此多的重复,这是一个正在解决的问题。计划在下一个草案中引入一个可能使这更容易的解决方案。
我想在允许类型的 json 架构文档中的任何位置允许 $role 属性。从理论上讲,我应该能够如下扩展它,其中我对 json 模式元模式和我的 $role 扩展执行 allOf,其中包括 additionalProperties 以递归地获取我的扩展元模式。我发现我得到了对顶级 $role 的验证,但没有得到任何嵌入式 $role 的验证。我错过了什么吗?有没有其他方法我应该扩展 JSON 模式元模式?
我尝试了很多不同的验证器,但它们都无法验证示例中的第二个 $role。
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"role": {
"type": "string",
"pattern": "^((lg)|(unionType\([a-zA-Z][a-zA-Z0-9.]*\)))$"
},
},
"allOf": [
{
"$ref": "http://json-schema.org/draft-07/schema#"
},
{
"properties": {
"additionalProperties": {
"$ref": "#"
},
"$role": {
"oneOf": [
{
"$ref": "#/definitions/role"
},
{
"type": "array",
"items": {
"$ref": "#/definitions/role"
}
}
]
}
}
}
]
}
使用此架构的示例:
{
"$schema": "schema.json",
"title": "Prompt",
"$role": "unionType(Microsoft.IPrompt)",
"properties": {
"prompt": {
"type": "string",
"$role":"foo"
}
}
}
我期望的是,根据架构,第二个角色应该是无效的。我得到的是它是有效的,即使它与 $role 模式不匹配。第一个 $role 验证成功。
是的,扩展元模式比看起来要复杂得多。查看 JSON Hyper-Schema meta schema 以获取有关如何扩展元模式的示例。 JSON Hyper-Schema 添加了两个关键字:base
和`links。扩展模式时,您需要重新定义原始模式中使用的任何递归引用。
JSON 模式(包括元模式)是不可变的。您不能有选择地修改现有架构。您的元模式仅验证 $role
关键字,所有其他关键字均由 draft-07 元模式验证。因为您的元架构不修改 draft-07 架构,所以像 properties
这样的关键字完全在 draft-07 架构的上下文中进行验证,并且不知道您在另一个架构中添加的新关键字。
不幸的是,扩展模式涉及如此多的重复,这是一个正在解决的问题。计划在下一个草案中引入一个可能使这更容易的解决方案。