如何扩展json模式元模式以支持新属性?

时间:2019-02-16 01:26:58

标签: jsonschema

我想在允许类型的json模式文档中的任何地方允许$ role属性。从理论上讲,我应该能够如下扩展它,在其中我对json模式元模式和$ role的扩展都执行allOf,其中包括额外的属性以递归地选择我的扩展元模式。我发现我得到了顶层$ role的验证,但没有得到任何嵌入式$ 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确实验证成功。

1 个答案:

答案 0 :(得分:1)

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

JSON模式(包括元模式)是不可变的。您不能选择性地修改现有架构。您的元架构仅验证$role关键字,所有其他关键字均由草稿07元架构验证。由于您的元架构不会修改07草案架构,因此properties之类的关键字将完全在07草案架构的上下文中进行验证,而无需了解您在其他架构中添加的新关键字。

不幸的是,扩展模式涉及大量重复,这是一个正在解决的问题。计划在下一个草案中引入使此操作更容易的潜在解决方案。