Как сделать обязательное свойство, если другое свойство пусто, и наоборот, в схеме JSON - PullRequest
1 голос
/ 27 марта 2020

Мое текущее json определение схемы выглядит следующим образом

{
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "minLength": 1
        },
        "description": {
            "type": "string",
            "minLength": 1
        },
        "input": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "name": {
                        "type": "string"
                    },
                    "description": {
                        "type": "string"
                    },
                    "type": {
                        "type": "string"
                    }
                },
                "required": ["name", "description", "type"]
            }
        },
        "output": {
            "type": "array",
            "maxItems": 1,
            "items": {
                "type": "object",
                "properties": {
                    "description": {
                        "type": "string",
                        "minLength": 1
                    },
                    "type": {
                        "type": "string"
                    }
                },
                "required": ["description", "type"]
            }
        }
    },
    "required": ["name", "description"]
}

Поэтому мне нужно проверить схему для следующих условий:

  1. Если входной массив и выходной массив пусто, оба должны быть обязательными;
  2. Если входной массив не пустой, то выходной массив не требуется;
  3. Если выходной массив не пустой, то входной массив не должен быть обязательным;

Спасибо заранее.

Ответы [ 2 ]

1 голос
/ 29 марта 2020

кажется, что все три ваших требования являются самореализуемыми в json схеме.

Если входной массив и выходной массив пусты, оба должны быть обязательными

, если input и output - пустые массивы, они уже присутствуют, поэтому утверждение, что они обязательны, является избыточным. своего рода, «если x присутствует со значением [], то x должен присутствовать». Схема Джейсона правильно отражает то, как вы это сформулировали, но я не думаю, что у этой схемы есть какой-либо способ вызвать ошибку проверки.

и ответ Джейсона верен в пунктах 2 и 3.

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

1 голос
/ 28 марта 2020

Ваше первое условие - единственное, с которым нам нужно иметь дело. Все свойства являются необязательными по умолчанию, поэтому ваши условия 2 и 3 переводятся в нечто вроде: «если входной массив не пустой, то ничего не делать».

Есть несколько способов выполнить первое условие, но я предлагаю следующее.

"allOf": {
  "if": {
    "properties": {
      "input": { "const": [] },
      "output": { "const": [] }
    }
  },
  "then": { "required": ["input", "output"] }
}
...