Черновик схемы JSON 07 if if для условной проверки - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь создать схему, которая имеет немного другую структуру в зависимости от значений, и решила использовать черновик 07 и ajv для ее проверки.Структура, которую я пытаюсь создать, выглядит следующим образом:

   "url":{
   "some-random-string":{
            "pattern":"somevalue",
            "handler":"one-of-a-few-allowed-values",
            "kwargs":{ "conditional object" with further constraints}
             }
   }

, шаблон необходим, и некоторые объекты kwargs будут иметь другие необходимые ключи.Я попытался использовать серию операторов if..then в сочетании со ссылкой следующим образом:

   "url": {
  "type": "object",
  "patternProperties": {
    "^.*$": {
      "properties": {
        "pattern": {
          "type": "string"
        },
        "handler": {
          "type": "string",
          "enum": ["val1","val2"...
          ]
        }
      },
      "required": ["pattern"],
       "if": {
          "properties": {
            "handler": {
              "enum": ["val1"]
            }
          }
        },
        "then": {
          "properties": {
            "kwargs": {
              "$ref": "#/definitions/val1"
            }
          }
        },
        "if": {
          "properties": {
            "handler": {
              "enum": ["val2"]
            }
          }
        },
        "then": {
          "properties": {
            "kwargs": {
              "$ref": "#/definitions/val2"
            },"required":["function"]
          }
        },

требуемое ограничение шаблона работает, требуемое ограничение функции - нет.

Я даже пытался свернуть все операторы if-then в массив allOf с каждым набором if-then внутри одного объекта, но, похоже, это не сработало.

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

     "val2": {
  "type": ["object", "boolean"],
  "properties": {
    "kwargs": {
      "type": "object",
      "properties": {
        "function": {
          "type": "string"
        },
        "methods": {
          "type": "array",
          "items": {
            "enum": ["GET", "PUT", "POST", "DELETE", "OPTIONS"]
          }
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 25 мая 2018

Эта схема использует if, чтобы проверить, присутствует ли handler в данных, then проверяет значение handler с const в anyOf контексте.

{
  "properties": {
    "url": {
      "type": "object",
      "patternProperties": {
        "^.*$": {
          "properties": {
            "pattern": {"type": "string"},
            "handler": {
              "type": "string",
              "enum": ["val1", "val2"]
            }
          },
          "required": ["pattern"],
          "if": {"required": ["handler"]},
          "then": {
            "anyOf": [
              {
                "properties": {
                  "handler": {"const": "val1"},
                  "kwargs": {"$ref": "#/definitions/val1"}
                }
              },
              {
                "properties": {
                  "handler": {"const": "val2"},
                  "kwargs": {"$ref": "#/definitions/val2"}
                }
              }
            ]
          }
        }
      }
    }
  },
  "definitions": {
    "val1": {
      "type": "string"
    },
    "val2": {
      "type": "integer"
    }
  }
}
...