【问题标题】:Can I declare a field in JSON Schema as “JSON Schema”?我可以将 JSON Schema 中的字段声明为“JSON Schema”吗?
【发布时间】:2019-09-09 00:56:11
【问题描述】:

我的一个项目接受“插件”。这些插件需要提供一个特殊的 JSON 文件,其中包含一些元信息,并使用JSON Schema 描述事件对象。例如:

{
    "name": "My component",
    "description": "My super awesome component",
    "documentation": "docs/main.md",
    "maintainer": "john.doe@example.com",
    "events": [{
        "name": "click",
        "description": "Occurs when the element is clicked.",
        "data": [{
                "name": "xPos",
                "description": "The horizontal position of the click.",
                "schema": {
                    "type": "integer",
                    "minimum": 0
                }
            }
        ]
    }]
}

此元文件将根据 JSON 架构进行验证。现在我的问题是,如何验证 events[0].data[0].schema 条目的内容?在这种情况下,预期的字段是一个整数,但它也可以是任何其他类型。是否有 "type":"schema" 或 JSON Schema 中定义的类似内容?

(无论如何,我使用ajv 作为验证器。)

【问题讨论】:

    标签: javascript json schema jsonschema


    【解决方案1】:

    您将寻找元模式!描述 JSON Schema 的 JSON Schema。

    你可以在http://json-schema.org/specification.html#meta-schemas找到他们

    您想像这样通过 $id 来引用元模式。

    {
      "$ref": "http://json-schema.org/draft-07/schema#"
    }
    

    使用上面的作为你的架构,下面的作为你想要失败的测试数据,你可以使用https://www.jsonschemavalidator.net看到它工作

    {
      "type": "integer",
      "minimum": 0,
      "properties": ["a"],
    }
    

    但是,您应该考虑,验证只会断言 false,因为 properties 必须是一个对象。 未知关键字是允许且有效的,因为是一个空对象,或者true 或false,所以如果在我的示例中将properties 更改为_properties,您的架构仍然会根据元模式有效。


    也相关:

    如果您想手动验证架构是否有效,ajv 可以让您轻松做到这一点!记录在https://ajv.js.org/#api-validateschema

    .validateSchema(Object schema) -> Boolean

    验证架构。此方法应用于验证模式 而不是验证由于 JSON 中 uri 格式的不一致 架构标准。

    默认情况下,此方法在架构被调用时自动调用 已添加,因此您很少需要直接使用它。

    如果架构没有 $schema 属性,则根据草稿对其进行验证 6 元模式(选项元不应为假)。

    如果 schema 具有 $schema 属性,则具有此 id 的 schema(即 应该是之前添加的)用于验证传递的架构。

    错误将在 ajv.errors 中提供。

    【讨论】:

    • 谢谢,但这意味着我无法将 schema 节点作为主模式的一部分进行验证……我必须将它们验证为 "type":"object",然后分别验证所有已知的 schema 节点。对吗?
    • 如果您正在为您的结构创建一个整体架构(其中包括一个架构),您可以使用 $ref 来引用元架构,以便在您希望看到架构的位置。我是否正确理解您的情况?您想创建一个模式,其中一部分是 JSON 模式?
    • 是的,我的架构的一部分是架构。请参阅上面的示例。
    • 啊,是的……$ref 是解决方案!
    猜你喜欢
    • 1970-01-01
    • 2015-01-29
    • 2018-08-04
    • 1970-01-01
    • 2021-03-08
    • 2015-04-11
    • 2011-11-22
    • 1970-01-01
    • 2014-07-29
    相关资源
    最近更新 更多