首页 > 解决方案 > 为什么 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,并且似乎验证也以类似的方式应用。

标签: jsonjsonschema

解决方案


您的架构有两个问题。第一个解决起来超级简单。一个错字(我们都做过)。

"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


推荐阅读