嗨,我很确定我的 json 模式做错了,我的用例是我使用文档向表中添加一些元素,在这种情况下,元素是通过名称、值键对添加的。现在,如果 name 的值为“name”,那么它的值对应该遵循正则表达式验证,除了 1 个特定场景,如果添加这些的 tableName 是标头,在这种情况下它不应该遵循此正则表达式模式。
我的架构是->
{
"properties": {
"elements": {
"type": "array",
"items": {
"$ref": "#arrayElement"
},
"minItems": 1
}
},
"definitions": {
"arrayElement": {
"$id": "#arrayElement",
"type": "object",
"required": ["tableName"],
"properties": {
"tableName": {
"type": "string"
},
"elms": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "value"],
"properties": {
"name": {
"type": "string"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
}
},
"minItems": 0
},
"ele2": {
"type": "object",
"$ref": "#objectElement"
},
"ele3": {
"type": "array",
"items": {
"$ref": "#arrayElement"
},
"minItems": 0
}
},
"allOf": [
{
"if": {
"properties": {
"elms": {
"items": {
"properties": {
"name": {
"const": "name"
}
}
}
}
}
},
"then": {
"allOf": [
{
"if": {
"properties": {
"tableName": {
"const": "header"
}
}
},
"then": {
"properties": {
"elms": {
"items": {
"properties": {
"value": {
"type": "string"
}
}
}
}
}
},
"else": {
"properties": {
"elms": {
"items": {
"properties": {
"value": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_.#/-]*$"
}
}
}
}
}
}
}
]
},
"else": {
"properties": {
"elms": {
"items": {
"properties": {
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
}
}
}
}
}
}
]
}
}
}
现在这个有效负载正在通过,由于名称的正则表达式验证,它应该会失败
"elements": [
{
"tableName": "row",
"elms": [
{
"name": "name",
"value": "__________________________"
},
{
"name": "format",
"value": "string"
},
{
"name": "length",
"value": 15
},
{
"name": "active",
"value": true
}
]
}
]
提前致谢。
编辑:为了进行更多调试,我一起删除了 tableName 上的条件,只是为了看看 name 上的基本条件是否有效,似乎它本身不起作用。难道是我表示properties.elms.items.properties.name的方式不正确?
{
"properties": {
"elements": {
"type": "array",
"items": {
"$ref": "#arrayElement"
},
"minItems": 1
}
},
"definitions": {
"arrayElement": {
"$id": "#arrayElement",
"type": "object",
"required": ["tableName"],
"properties": {
"tableName": {
"type": "string"
},
"elms": {
"type": "array",
"items": {
"type": "object",
"required": ["name", "value"],
"properties": {
"name": {
"type": "string"
},
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
}
},
"minItems": 0
},
"ele2": {
"type": "object",
"$ref": "#objectElement"
},
"ele3": {
"type": "array",
"items": {
"$ref": "#arrayElement"
},
"minItems": 0
}
},
"allOf": [
{
"if": {
"properties": {
"elms": {
"items": {
"properties": {
"name": {
"const": "name"
}
}
}
}
}
},
"then": {
"properties": {
"elms": {
"items": {
"properties": {
"value": {
"type": "string",
"pattern": "^[A-Za-z][A-Za-z0-9_.#/-]*$"
}
}
}
}
}
},
"else": {
"properties": {
"elms": {
"items": {
"properties": {
"value": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
}
]
}
}
}
}
}
}
}
]
}
}
}
您的条件比需要的复杂得多。
现在,如果 name 的值为“name”,那么它的值对应该遵循正则表达式验证,除了 1 个特定场景,如果添加这些的 tableName 是 header,在这种情况下它不应该遵循此正则表达式模式。
您可以将此条件表示为单个模式。
{
"type": "object",
"properties": {
"tableName": {
"not": { "const": "header" }
},
"elms": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": { "const": "name" }
},
"required": ["name"]
}
}
},
"required": ["tableName", "elms"]
}
这就是您的
if
模式。您的then
模式是正确的。你不需要else
。无需嵌套。