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

回到顶部