JSON Schema草案07如果那么条件验证的语句

时间:2018-05-25 05:15:08

标签: jsonschema ajv

我正在尝试根据值创建一个结构略有不同的模式,并决定使用draft 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 :(得分:2)

此架构使用if来检查数据中是否存在handlerthen它会在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"
    }
  }
}