Убедитесь, что в схеме JSON верно только одно свойство массива - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть множество опций. Каждый элемент в массиве будет иметь текст и логическое значение isAnswer Я пытаюсь проверить таким образом, что только один из элементов может быть и должен быть помечен как true. Все остальное должно быть недействительным. Через два элемента верны или 0 верны, если произойдет сбой. Я играл с oneOf, так как это, кажется, имеет больше смысла, но всегда подтверждает успешность.

Прежде всего, возможно ли это проверить? Во-вторых, я на правильном пути?

Спасибо за любую помощь, которую вы можете предложить

   "question": {
      "title": "Question",
      "type": "object",
      "properties": {
        "options": {
          "title": "Options",
          "type": "array",
          "minItems": 2,
          "maxItems": 10,
          "items": {
            "title": "Option",
            "type": "object",
            "properties": {
              "isAnswer": {
                "title": "Answer",
                "type": "boolean",
                "format": "checkbox",
                "default": false
              },
              "text": {
                "title": "Choice Text",
                "type": "string"
              },
            },
            "oneOf": [
              {
                "properties": {
                  "isAnswer": true
                }
              }
            ]
          }
        }
      }
    }

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

этот вопрос почти идентичен Как принудительно установить в массиве только одно значение свойства true (JSON Схема) - проверьте ответ на этот вопрос.

это немного по-другому, потому что у вас есть maxItems - это открывает уродливую опцию грубого форсирования возможных комбинаций.

Я собираюсь сделать вид, что ваши maxItems 3 вместо 10, чтобы сократить многословие:

definitions:
  correctAnswer:
    {properties: {isAnwser: {const: true}}}
  incorrectAnswer:
    {properties: {isAnwser: {const: false}}}

oneOf:
  - items: [{'$ref': '#/definitions/correctAnswer'}, {'$ref': '#/definitions/incorrectAnswer'}, {'$ref': '#/definitions/incorrectAnswer'}]
  - items: [{'$ref': '#/definitions/incorrectAnswer'}, {'$ref': '#/definitions/correctAnswer'}, {'$ref': '#/definitions/incorrectAnswer'}]
  - items: [{'$ref': '#/definitions/incorrectAnswer'}, {'$ref': '#/definitions/incorrectAnswer'}, {'$ref': '#/definitions/correctAnswer'}]

некрасиво и неприемлемо! лучше написать это требование в своем коде, если только / пока вы не сможете использовать 2019-09.

другие примечания:

  • oneOf проверяет, что один из набора схемы проверяются на соответствие экземпляру, а не проверяет, проверяет ли один элемент экземпляра массива на соответствие схеме.

  • у вас есть "properties": {"isAnswer": true} - то, что вы хотите, есть "properties": {"isAnswer": {"const": true}}. то, что у вас есть, будет использовать true схему , которая соответствует любому экземпляру. const соответствует экземпляру, равному его значению.

0 голосов
/ 08 апреля 2020

Этот вид теста называется «бизнес-логика c» или «проверка согласованности данных», что выходит за рамки JSON Схема (и большинство инструментов проверки, таких как XML Схема, RELAX NG и подобно). См. Область действия JSON Проверка схемы для получения дополнительной информации по этому вопросу.

Технически возможно написать схему, которая дает результаты, которые вы ищете, путем создания различных схем, по одному на каждый возможный правильный ответ. Подобные решения используются для проверки различных классов объектов, где поле «категория» или «тип» определяет, как проверять все остальные свойства.

Однако JSON Схема не поддерживает сравнение одного значения с другим в общем.

Что касается схемы, ваша схема приемлема; но я хотел бы рассмотреть возможность указания ответа отдельно от вопросов:

{
  "options": [
    { "text": "Butaful" },
    { "text": "Bueatful" },
    { "text": "Beautiful" },
    { "text": "Beeyoutiful" }
  ],
  "answer": "Beautiful"
}

Это добавляет некоторую избыточность и поддерживает ответы в произвольной форме.

...