【问题标题】:JSON Schema validator compatibilityJSON Schema 验证器兼容性
【发布时间】:2021-04-14 13:24:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: jsonschema


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2020-04-02
      • 2021-04-18
      • 2014-08-05
      • 2019-10-18
      相关资源
      最近更新 更多