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