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”则可以响应错误。
我试图了解单个 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”则可以响应错误。