首页 > 解决方案 > “maxContains”限制不适用于 JSON 模式

问题描述

如何检查以下 JSON 中的属性是否严格isCorrect具有一次值。true将其视为只有一个答案的多项选择题,因此数组中可以有很多元素,但答案只能在所有元素中为真一次。

  "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 个元素,它也会验证isCorrectbeing true,所以我使用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错误吗?任何帮助表示赞赏!

标签: jsoncontainsjsonschemajson-schema-validator

解决方案


minContains并被maxContains添加到draft 2019-09. 它们不是 的一部分draft-07,未知关键字将被忽略。

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

现在,您必须自己将关键字实现为扩展(如果您使用的库支持此类事情),或者编写在 JSON Schema 验证之后发生的额外业务逻辑代码。


推荐阅读