Как принудительно установить в массиве только одно значение свойства (JSON Схема) - PullRequest
2 голосов
/ 01 апреля 2020

Я пытаюсь получить JSON проверку на основе следующего ввода:

{
  "elements":[
    {
      "..."
      "isSelected": true
    },
    {
      "..."
      "isSelected": false
    },
    {
      "..."
      "isSelected": false
    }    
  ]
}

Ввод будет действительным, если и только если у нас для "isSelected" установлено значение "true" (и все остальное установлено на «ложь»). Не может иметь «isSelected: true» более одного раза (а все остальные должны быть «false»).

Попробовал следующее:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "definitions": {
    "element":{
      "type": "object",
      "properties": {
        "isSelected": {
          "type": "boolean"
        }
      }      
    }
  },
  "properties": {
    "elements": {
      "type": "array",
      "items": {
        "$ref": "#/definitions/element"
      },
      "oneOf": [
        {
            "isSelected": true
        }   
      ]
    }
  },

}

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

к сожалению, я не думаю, что это возможно с json черновиком схемы 7. новейший черновик (2019-09) содержит ключевое слово maxContains, которое сможет это проверить, но инструменты для этого черновика редки уже. Я не знаю, какой инструмент вы используете, но если вы сможете использовать 2019-09, схема для «элементов» будет выглядеть примерно так:

{
  "type": "array",
  "contains": {
    "properties": {
      "isSelected": {"const": true}
    }
  },
  "maxContains": 1
}

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

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

В настоящее время это не поддерживается, но вас может заинтересовать это предложение , которое намеревается добавить ключевое слово для поддержки уникальности элемента на основе ключа. Это не совсем то же самое, но я думаю, что это связано.

...