Схема JSON - как сделать обязательным поле, зависящее от перечисления?

У меня есть схема JSON (v7.0), в которой мне нужно убедиться, что точно перечисленные свойства присутствуют в окончательной formData.

В большинстве случаев это можно решить с помощью "additionalProperties": false и "minProperties": X, где X представляет #properties в объекте (любезно предоставлено это решение)

Однако в некоторых случаях количество свойств варьируется.

Так обстоит дело в приведенном ниже примере, где выбор «Обновление вручную» (перечисление 2) в «синхронизации» может привести к добавлению поля «manual_date». Если для параметра «синхронизация» установлено значение «Обновление вручную», свойство «manual_date» должно быть обязательным, но в противном случае оно не требуется.

Я попытался реализовать это с помощью оператора «required» в зависимостях, но я считаю, что это неправильно, так как при тестировании через валидатор.

Короче говоря: я ищу правильный способ сделать поля, зависящие от перечисления, обязательными в моей схеме JSON.


Моя схема:

{
  "type": "object",
  "properties": {
    "rtc": {
      "title": "REAL-TIME-CLOCK (RTC)",
      "type": "object",
      "properties": {
        "sync": {
          "title": "Time synchronization method",
          "type": "integer",
          "default": 1,
          "anyOf": [
            {
              "type": "integer",
              "title": "Retain current time",
              "enum": [
                1
              ]
            },
            {
              "type": "integer",
              "title": "Manual update",
              "enum": [
                2
              ]
            },
            {
              "type": "integer",
              "title": "Automatic update (requires WiFi)",
              "enum": [
                3
              ]
            }
          ]
        },
        "timezone": {
          "title": "Time zone (UTC−12 to UTC+14)",
          "type": "number",
          "default": 0,
          "minimum": -12,
          "maximum": 14
        },
        "adjustment": {
          "title": "Adjustment (-129600 to 129600 seconds)",
          "type": "number",
          "default": 0,
          "minimum": -129600,
          "maximum": 129600
        }
      },
      "dependencies": {
        "sync": {
          "oneOf": [
            {
              "properties": {
                "sync": {
                  "enum": [
                    1
                  ]
                }
              }
            },
            {
              "properties": {
                "sync": {
                  "enum": [
                    2
                  ]
                },
                "manual_date": {
                  "title": "Time (UTC) ",
                  "type": "string",
                  "format": "date-time"
                }
              },
              "required": [
                "manual_date"
              ]
            },
            {
              "properties": {
                "sync": {
                  "enum": [
                    3
                  ]
                }
              }
            }
          ]
        }
      },
      "additionalProperties": false,
      "patternProperties": {
        "manual_date": {}
      },
      "minProperties": 3
    }
  }
}

person Martin    schedule 29.03.2017    source источник


Ответы (1)


Обновление: я не нашел прямого решения этой проблемы. Однако частичное решение может быть выполнено путем использования комбинации additionalProperties: false и minProperties: X. Это помогает гарантировать, что нужное количество полей - и только нужные поля будут включены.

person Martin    schedule 15.03.2019