如何验证 JSON 模式文件的有效性?

How do I verify the validity of a JSON Schema file?

我有一个像这样的 JSON Schema 文件,其中包含一些故意的错误:

{
    "$schema": "http://json-schema.org/schema#",
    "type": "object",
    "description": "MWE for JSON Schema Validation",
    "properties": {
      "valid_prop": {
        "type": ["string", "number"],
        "description": "This can be either a string or a number."
      },
      "invalid_prop": {
        // NOTE: "type:" here should have been "type" (without the colon)
        "type:": ["string", "null"],
        "description": "Note the extra colon in the name of the type property above"
      }
    },
    // NOTE: Reference to a non-existent property
    "required": ["valid_prop", "nonexistent_prop"]
}

我想编写一个 Python 脚本(或者更好的是,安装带有 PiP 的 CLI)来查找这些错误。

我看过 this answer,它建议执行以下操作(针对我的用例进行了修改):

import json
from jsonschema import Draft4Validator

with open('./my-schema.json') as schemaf:
    schema = json.loads('\n'.join(schemaf.readlines()))
    Draft4Validator.check_schema(my_schema)
    print("OK!") # on invalid schema we don't get here

但是上面的脚本没有检测到架构文件中的任何错误。我会怀疑它检测到 至少 "type:" 属性.

中的额外冒号

我是否错误地使用了库?如何编写检测此错误的验证脚本?

您说架构无效,但您提供的示例并非如此。

忽略未知关键字。这是为了允许创建扩展。如果阻止未知关键字,我们就不会有各种人和团体创建的扩展生态系统,例如表单生成。

你说required中的值是一个"Reference to a non-existent property"。 required关键字没有link到properties关键字。

required 确定对象必须具有哪些键。

properties 确定应如何将子模式应用于对象中的值。

required 中的值不需要也包含在 properties 中。事实上,在构建复杂的模块化架构时,他们通常不这样做。

就验证架构是否有效而言,您可以使用 JSON 架构元架构。

关于检查您认为不需要的其他内容,这取决于您,因为您提供的示例是有效的。

有些库可能会提供健全性检查,但您提供的示例不太可能被采纳,因为它们不是错误。