«maxContains» ограничение не работает для JSON схемы - PullRequest
1 голос
/ 19 февраля 2020

Как проверить, если в следующем 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 элемента с isCorrect, равным 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? Любая помощь приветствуется!

1 Ответ

1 голос
/ 19 февраля 2020

minContains и maxContains были добавлены в draft 2019-09. Они не являются частью draft-07, а неизвестные ключевые слова игнорируются.

На момент написания проекта черновик 2019-09 является довольно новым и имеет только одну известную реализацию.

На данный момент вам придется либо реализовать ключевое слово самостоятельно как расширение (если используемая вами библиотека поддерживает такие вещи), либо написать дополнительный код бизнес-логики c, который происходит после JSON проверки схемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...