Обходной путь для "minContains" и "maxContains" в JSON черновик проверки схемы-07? - PullRequest
1 голос
/ 06 августа 2020

Последний выпуск проверки схемы JSON (2019-09) позволяет ставить условия (под-схему), используя , содержит ключевое слово , а также сколько раз это условие может появляться в схеме JSON с использованием minContains & maxContains . Эта функция недоступна в 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 как минимум дважды, как я могу этого добиться? Любая помощь приветствуется! Спасибо.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

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

0 голосов
/ 06 августа 2020

На самом деле нет способа смоделировать minContains / maxContains в draft-07. Вот несколько примеров наиболее близких, которые вы можете получить.

Как "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 }
      }
    }
  }
}
...