json - 为什么 JSON Schema 最大值在 allOf 中不起作用?
问题描述
给定以下 JSON 模式:
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"properties": {
"pageA": {
"properties": {
"a": { "type": "number" },
},
"allOf": [
{
"if": {
"properties": {
"a": { "maximum": 10 }
}
},
"then": {
"properties": {
"b": { "type": "number" },
"c": { "type": "string" }
}
},
"else": {
"allOf": [
{
"if": {
"properties": {
"a": { "maximum": 20 }
}
},
"then": {
"properties": {
"e": { "type": "number" },
"f": { "type": "string" }
}
},
"else": {
"allOf": [
{
"if": {
"properties": {
"a": { "maxiumum": 30 }
}
},
"then": {
"properties": {
"i": { "type": "number" },
"j": { "type": "string" }
}
},
"else": {
"properties": {
"k": { "type": "number" },
"l": { "type": "string" }
}
}
}
]
}
}
]
}
}
]
}
}
}
我希望:
{
"pageA": {
"a": 31,
"k": "50"
}
}
生成“无效的类型。预期的数字,但得到了字符串。” 但它是有效的。我知道嵌套在 an 中的任何属性allOf
都不能被 捕获additionalProperties
,并且似乎验证也以类似的方式应用。
解决方案
您的架构有两个问题。第一个解决起来超级简单。一个错字(我们都做过)。
"a": { "maxiumum": 30 }
应该读maximum
。
现在让我们看一下规范,看看有什么maximum
...
"maximum" 的值必须是一个数字,表示数字实例的包含上限。
如果实例是一个数字,则此关键字仅在实例小于或正好等于“最大值”时才有效。
https://json-schema.org/draft/2019-09/json-schema-validation.html#rfc.section.6.2.2
鉴于 30 正好等于 30,您触发了您的then
子句而不是您的else
子句。
如果您希望该值是 EXCLUSIVE,那么还有另一个关键字 ... exclusiveMaximum
,它就是这样做的。
您可以在这里看到它的实际效果:https ://jsonschema.dev/s/8Yi6e
推荐阅读
- json - JSON Schema 中有没有办法让数字属性的最小值和最大值以另一个属性为条件?
- swift - Swift Combine 框架 setFailureType 错误运算符
- julia - 将字符串中的 2 位日期年份转换为日期对象
- c# - 如何在C#中制作一个必须在特定时间范围内特定位置单击的按钮
- c++ - Qt 中的元组和 MSVC 编译器
- python - Tensorflow Tokenizer 恢复 fit_on_sequences
- python - 查询集中的注释分组
- amazon-web-services - 如何为 dynamodb 表使用端点?
- c# - 当 Accept 标头不是完全支持的媒体类型时,不选择自定义 TextOutputFormatter,但仅包含它
- flutter - 从多个下拉菜单中获取值并将它们连接为一个