JSON if/then/else 架构未按预期工作

JSON Schema not working as expected with if/then/else

我有以下架构:

{
  "type": "object",
  "properties": {
    "street_address": {
      "type": "string"
    },
    "country": {
      "default": "United States of America",
      "enum": ["United States of America", "Canada", "Netherlands"]
    }
  },
  "allOf": [
    {
      "if": {
        "properties": { "country": { "const": "United States of America" } }
      },
      "then": {
        "properties": { "postal_code": { "pattern": "[0-9]{5}(-[0-9]{4})?" } }
      }
    },
    {
      "if": {
        "properties": { "country": { "const": "Canada" } },
        "required": ["country"]
      },
      "then": {
        "properties": { "postal_code": { "pattern": "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]" } }
      }
    },
    {
      "if": {
        "properties": { "country": { "const": "Netherlands" } },
        "required": ["country"]
      },
      "then": {
        "properties": { "postal_code": { "pattern": "[0-9]{4} [A-Z]{2}" } }
      }
    }
  ]
}

这是从这里复制的https://json-schema.org/understanding-json-schema/reference/conditionals.html

当我将 allOf 关键字更改为 anyOf 时,它给了我意想不到的结果。我正在使用 Ajv 进行验证。

即使使用以下数据也能通过验证: { country: "Canada", postal_code: "some invalid code" }

但是当我只留下一个 if/then 语句(对于加拿大)时,它会按预期失败。 在我将关键字更改为 oneOf 的情况下,它失败了,因为传递的模式不止一个。

为什么会这样?

您的条件没有任何“else”子句——所以如果 if 部分为假,else 将默认为 true 这将导致该分支allOf 为真。您可能想为其中的每一个添加一个 "else": false

(此外,我注意到您的正则表达式未锚定 - 因此例如“abc01234xyz”将匹配您的美国 postal_code 模式。)