"maxContains" 限制不适用于 JSON 模式

"maxContains" limit not working for JSON schema

如何检查以下 JSON 中 属性 isCorrect 的值是否为 truestrictly once。把它想象成一个只有一个答案的选择题,所以数组中可以有很多元素,但答案在所有元素中只能为真一次。

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

我使用contains来验证是否至少有一个元素满足条件,但即使有超过1个isCorrecttrue的元素,它也会验证,所以我用了maxContains但是没用。

我的架构:

{
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://eg.com/schema2.json",
  "type": "object",
  "title": "Example",
  "required": ["answers"],
  "properties": {
    "answers": {
      "type": "array",
      "contains": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "text": {
            "type": "string"
          },
          "isCorrect": {
            "type": "boolean",
            "enum": [true]
          }
        }
      },
      "maxContains": 1,
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "text": {
            "type": "string"
          },
          "isCorrect": {
            "type": "boolean"
          }
        }
      }
    }
  }
}

不应验证此实例,因为它的 true 值在 isCorrect 中出现两次,并且架构提到 maxContains 为 1,但它不起作用。我做错了什么, maxContains 的位置错了吗?感谢您的帮助!

draft 2019-09 中添加了

minContainsmaxContains。 它们不是 draft-07 的一部分,未知关键字将被忽略。

在撰写本文时,2019-09 草案还很新,只有一个已知的实现。

现在,您必须自己将关键字实现为扩展(如果您使用的库支持此类功能),或者编写在 JSON 架构验证之后发生的其他业务逻辑代码.