【问题标题】:How do you extend json schema meta schema to support new properties?您如何扩展 json 模式元模式以支持新属性?
【发布时间】:2023-03-03 02:16:01
【问题描述】:

我想在 json 模式文档中允许类型的任何地方允许 $role 属性。从理论上讲,我应该能够将它扩展如下,其中我针对 json 模式元模式和我的 $role 扩展执行 allOf,其中包括用于递归获取我的扩展元模式的附加属性。我发现我得到了顶级 $role 的验证,但没有得到任何嵌入式角色的验证。我错过了什么吗?我应该以其他方式扩展 JSON Schema 元模式吗?

我尝试了一堆不同的验证器,但它们都无法验证示例中的第二个 $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 确实验证成功。

【问题讨论】:

    标签: jsonschema


    【解决方案1】:

    是的,扩展元模式比看起来要复杂得多。查看JSON Hyper-Schema meta schema 以获取有关如何扩展元模式的示例。 JSON Hyper-Schema 增加了两个关键字:base 和 `links。扩展架构时,您需要重新定义原始架构中使用的任何递归引用。

    JSON 模式(包括元模式)是不可变的。您不能有选择地修改现有架构。您的元模式仅验证 $role 关键字,所有其他关键字均由 draft-07 元模式验证。因为您的元架构不会修改 draft-07 架构,所以像 properties 这样的关键字完全在 draft-07 架构的上下文中进行验证,并且不知道您在另一个架构中添加的新关键字。

    很遗憾,扩展模式涉及到如此多的重复,这是一个正在解决的问题。将在下一个草案中引入一个使这更容易的潜在解决方案。

    【讨论】:

    • 感谢您的帮助。在有更简单的方法之前,我通过读取draft-07 模式并使用所需属性对其进行扩展的代码来执行此操作。理想情况下,我希望 $role 在顶部与 $role 不在顶部有不同的约束,但这真的让我心烦意乱。
    猜你喜欢
    • 2012-05-14
    • 2019-03-05
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多