为什么 JSONSchema 同时允许不同类型的约束
Why JSONSchema allows different types constraints simultaneously
假设我想将 JSON 对象限制为 > 42 的整数或此类整数的数组。
有效的 draft-04 架构
{
"minimum" : 42,
"items" : { "type":"integer", "minimum" : 42 }
}
验证 42
和 [52, 62]
,但也验证 "hello"
。所以这是构建模式的错误方法。
除了正确的模式包含冗余 "type" 字段,因为 "items" 暗示数组类型:
{
"oneOf": [
{
"type": "integer",
"minimum" : 42
},
{
"type": "array",
"items" : { "type":"integer", "minimum" : 42 }
}
]
}
问题
同时允许不同类型约束的原因是什么?
这是一个糟糕的设计还是我错过了什么?
https://github.com/json-schema/json-schema/issues/172
link 上的讨论应该可以帮助您理解它为何如此工作。简短的版本是 JSON Schema 被设计成简单、一致和灵活的。这些特性使模式具有更强的表现力,但它也允许您编写您可能不应该编写的模式。在 linked 讨论的最后,我给出了一些示例,说明这种表现力如何有用,如果收紧一些粗糙的边缘,会使 JSON 模式变得不那么优雅。
假设我想将 JSON 对象限制为 > 42 的整数或此类整数的数组。
有效的 draft-04 架构
{
"minimum" : 42,
"items" : { "type":"integer", "minimum" : 42 }
}
验证 42
和 [52, 62]
,但也验证 "hello"
。所以这是构建模式的错误方法。
除了正确的模式包含冗余 "type" 字段,因为 "items" 暗示数组类型:
{
"oneOf": [
{
"type": "integer",
"minimum" : 42
},
{
"type": "array",
"items" : { "type":"integer", "minimum" : 42 }
}
]
}
问题
同时允许不同类型约束的原因是什么?
这是一个糟糕的设计还是我错过了什么?
https://github.com/json-schema/json-schema/issues/172
link 上的讨论应该可以帮助您理解它为何如此工作。简短的版本是 JSON Schema 被设计成简单、一致和灵活的。这些特性使模式具有更强的表现力,但它也允许您编写您可能不应该编写的模式。在 linked 讨论的最后,我给出了一些示例,说明这种表现力如何有用,如果收紧一些粗糙的边缘,会使 JSON 模式变得不那么优雅。