jsonschema - 具有静态属性的动态属性
我有一个模式来验证JSON。jsonschema - 具有静态属性的动态属性
对于某些属性,我需要它们具有某些类型的值。
- 如果 “ATTR” 属性为 “a”,然后 “VAL” 属性应该是 “整数”
- 如果 “ATTR” 属性为 “x”,则 “VAL” 属性应该是 “布尔”
- 如果 “ATTR” 属性为 “b”,然后 “VAL” 属性应该是 “字符串” 与 格式的 “IPv4”
等等...
这一点,我可以oneOff定义。对于所有其他的“属性”属性,我需要它们具有某种格式,有点像捕获所有,“val”属性是“字符串”。
- 如果“attr”匹配pattern,那么“val”属性应该是“string”。
可以这样做。
这是我现在的模式。
{ "$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"name": {
"title": "name",
"type": "string"
},
"attribute": {
"title": "attributes",
"type": "object",
"$ref": "#/definitions/expr",
}
},
"definitions": {
"expr": {
"properties": {
"attr": {
"title": "attribute"
},
"val": {
"title": "val"
}
},
"required": ["val", "attr"],
"oneOf": [
{
"properties": {
"attr": {"enum": ["a","b"]},
"val": {"type": "integer"}
}
},
{
"properties": {
"attr": {"enum": ["x"]},
"val": {"type": "boolean"}
}
},
{
"properties": {
"attr": {"pattern": "^[-A-Za-z0-9_]*$", "maxLength": 255},
"val": {"type": "string"}
}
}
]
}
},
"additionalProperties": false,
"required": [
"name",
"attribute"
]
}
问题是我试图限制值类型的属性,也匹配catchall格式。所以当我期待一个整数值时,它传递的是字符串值。
例如:
下面JSON将通过模式的基础上,oneOff
{ "name": "shouldpass",
"attribute": {
"attr": "a",
"val": 1
}
}
下面JSON将通过第一项,基于oneOff的最后一个项目。
{ "name": "shouldpass2",
"attribute": {
"attr": "h",
"val": "asd"
}
}
以下JSON失败,基于oneOff的第一个项目,但它也传递,因为它是匹配oneOff的最后一个项目。
{ "name": "shouldfail",
"attribute": {
"attr": "a",
"val": "string"
}
}
如何实现这个目标?
回答:
在过去的子模式
您架构ATTR可能是:
{ "pattern": "^[-A-Za-z0-9_]*$",
"not": { "enum": ["a", "b", "x"] },
"maxLength": 255
}
或者,而不是“oneOf”你可以使用“开关”的关键字从下一个JSON-架构版本建议:http://epoberezkin.github.io/ajv/keywords.html#switch-v5-proposal
它在Ajv中实现(我是作者)。
以上是 jsonschema - 具有静态属性的动态属性 的全部内容, 来源链接: utcz.com/qa/259308.html