JSON 架构验证程序兼容性

JSON Schema validator compatibility

我试图了解单个 JSON 架构在不同验证器中的行为方式。一些验证器定义自定义关键字。例如 ajv 验证器 ajv-keywords 包定义了一个 prohibited 关键字,它不是 JSON 模式标准的一部分。另一方面,JSON 架构定义了 required 关键字,它似乎与 prohibited 截然相反。 JSON 架构还定义了一个 oneOf 组合器,可用于验证输入是否应与多个架构定义中的一个且仅匹配一个。

考虑以下架构示例。通过阅读 json 模式规范,我得到的印象是示例 json 模式在 ajv 中使用时应该验证任何 json 对象。但是,根据未知关键字规则,验证器应该忽略它们不支持的任何关键字。所以,我想另一个验证器会忽略自定义 prohibited 关键字,导致模式拒绝带有 属性 foo 的输入。这是正确的还是我没有阅读 json 架构规范?

{
    "oneOf": [
        {
            "type": "object",
            "required": ["foo"]
        },
        {
            "type": "object",
            "prohibited": ["foo"]
        }
    ]
}

你是对的。标准 JSON 模式验证器将无法验证具有 属性 “foo” 的对象。如果您希望标准验证程序使用您的架构,则应非常小心地使用非标准关键字。

使用自定义关键字应该没问题,只要遵循渐进增强的原则。实际上,这意味着如果忽略自定义关键字,行为应该尽可能优雅地降级。您的示例违反了此原则,因为如果 prohibited 被忽略,您最终会得到假阴性结果。

遵循渐进增强的简单示例可能如下所示...

{
  "type": "object",
  "properties": {
    "foo": {}
  },
  "required": ["foo"],
  "prohibited": ["bar"]
}

如果我 运行 通过标准验证器执行此操作,则所有断言都会按预期工作,但 prohibited 除外,它会被忽略。假设客户端-服务器架构,这允许客户端在将它们发送到服务器之前主要验证它们的请求。然后服务器使用理解自定义关键字的验证器进行自己的验证,如果存在“bar”则可以响应错误。