JSON 模式验证 draft-07 中 "minContains" & "maxContains" 的解决方法?

Workaround for "minContains" & "maxContains" in JSON Schema validation draft-07?

最新的 JSON 模式验证版本 (2019-09) 允许使用 contains[=34 放置条件(子模式) =] 关键字以及使用 minContains & [= 该条件在 JSON 模式中可以出现多少次29=]最大包含。此功能在 draft-07 中不可用。有没有办法在不使用这些关键字的情况下实现这一目标?例如

"answers": [
    {
      "id": 1,
      "text": "choice1",
      "isCorrect": true
    },
    {
      "id": 1,
      "text": "choice2",
      "isCorrect": false
    },
    {
      "id": 1,
      "text": "choice3",
      "isCorrect": false
    },
    {
      "id": 1,
      "text": "choice4",
      "isCorrect": false
    }
  ]
}

包含的条件如下:

"contains":{
  "properties":{
    "isCorrect":{
      "enum":["true"]
     }
  }
}

这会检查 isCorrect 至少一次是 true。但是,如果我希望仅当 isCorrect 的值至少两次为 true 时才通过验证,我该如何实现? 任何帮助表示赞赏!谢谢。

不,没有,这就是我们为草稿添加关键字的原因 2019-09。对不起。

在 draft-07 中没有真正模拟 minContains/maxContains 的方法。以下是您可以获得的最接近的示例。

"minContains": 2,如果你有固定数量的元素。这不是很漂亮,但是您可以枚举这两个项目在数组中出现的所有可能方式。

{
  "type": "array",
  "maxItems": 4,
  "minItems": 4,
  "anyOf": [
    {
      "items": [
        { "$ref": "#/definitions/isCorrect-true" },
        { "$ref": "#/definitions/isCorrect-true" }
      ]
    },
    {
      "items": [
        { "$ref": "#/definitions/isCorrect-true" },
        true,
        { "$ref": "#/definitions/isCorrect-true" }
      ]
    },
    {
      "items": [
        { "$ref": "#/definitions/isCorrect-true" },
        true,
        true,
        { "$ref": "#/definitions/isCorrect-true" }
      ]
    },
    {
      "items": [
        true,
        { "$ref": "#/definitions/isCorrect-true" },
        { "$ref": "#/definitions/isCorrect-true" }
      ]
    },
    {
      "items": [
        true,
        { "$ref": "#/definitions/isCorrect-true" },
        true,
        { "$ref": "#/definitions/isCorrect-true" }
      ]
    },
    {
      "items": [
        true,
        true,
        { "$ref": "#/definitions/isCorrect-true" },
        { "$ref": "#/definitions/isCorrect-true" }
      ]
    }
  ],
  "definitions": {
    "isCorrect-true": {
      "type": "object",
      "properties": {
        "isCorrect": { "const": true }
      }
    }
  }
}

类似于 "minContains": 2,除了所有 true 项都需要在数组中排在第一位。

{
  "type": "array",
  "items": [
    { "$ref": "#/definitions/isCorrect-true" },
    { "$ref": "#/definitions/isCorrect-true" }
  ],
  "definitions": {
    "isCorrect-true": {
      "type": "object",
      "properties": {
        "isCorrect": { "const": true }
      }
    }
  }
}

类似于 "maxContains": 2,除了所有 true 项都需要在数组中排在第一位。

{
  "type": "array",
  "items": [
    true,
    true
  ],
  "additionalItems": { "not": { "$ref": "#/definitions/isCorrect-true" } },
  "definitions": {
    "isCorrect-true": {
      "type": "object",
      "properties": {
        "isCorrect": { "const": true }
      }
    }
  }
}

类似于 "minContains": 2, "maxContains": 2,除了所有 true 项都需要在数组中排在第一位。

{
  "type": "array",
  "items": [
    { "$ref": "#/definitions/isCorrect-true" },
    { "$ref": "#/definitions/isCorrect-true" }
  ],
  "additionalItems": { "not": { "$ref": "#/definitions/isCorrect-true" } },
  "definitions": {
    "isCorrect-true": {
      "type": "object",
      "properties": {
        "isCorrect": { "const": true }
      }
    }
  }
}