我正在处理一个JSON模式,我一直在进行数组验证。我有一个输入JSON的例子
{
"paths_1": {
"path_1": [
{
"abc": "valid_abc"
},
{
"abc": "invalid_abc"
}
]
},
"paths_2": {
"path_2": [
{
"ghi": "valid_ghi"
}
]
}
}
我对这个JSON数据的规则是,如果paths_2.path_2[]. ghi
是valid_ghi并且paths_1.path_1[]. abc
是valid_abc,那么需要具有valid_abc的对象的def键。
我为这个规则创建了这个JSON模式,但是它不能像预期的那样工作。
{
"$schema": "http://json-schema.org/draft-07/schema",
"type": "object",
"properties": {
"paths_1": {
"type": "object",
"properties": {
"items": {
"properties": {
"path_1": {
"properties": {
"abc": {
"type": "string"
},
"def": {
"type": "string"
}
}
}
}
}
}
},
"paths_2": {
"type": "object",
"properties": {
"items": {
"properties": {
"path_2": {
"properties": {
"ghi": {
"type": "string"
}
}
}
}
}
}
}
},
"allOf": [
{
"if": {
"allOf": [
{
"properties": {
"paths_1": {
"properties": {
"path_1": {
"contains": {
"properties": {
"abc": {
"const": "valid_abc"
}
},
"required": [
"abc"
]
}
}
}
}
}
},
{
"properties": {
"paths_2": {
"properties": {
"path_2": {
"contains": {
"properties": {
"ghi": {
"const": "valid_ghi"
}
},
"required": [
"ghi"
]
}
}
}
}
}
}
]
},
"then": {
"properties": {
"paths_1": {
"properties": {
"path_1": {
"items": {
"required": [
"def"
]
}
}
}
}
}
}
}
]
}
当我测试这个模式时,它返回“def”是带有“invalid_abc”的对象的必需属性,而它不应该。
我尝试更改JSON模式中项目的包含键,但在本例中,若部分变为false,并且验证器返回该输入是有效的。
有没有办法用给定的规则验证此输入?
您需要再次检查项目
中的valid_abc
。
您的then
子句没有上下文,我想这正是您所期望的。
"items": {
"if": {
"properties": {
"abc": {
"const": "valid_abc"
}
},
"required": [
"abc"
]
},
"then": {
"required": [
"def"
]
}
}
演示:https://jsonschema.dev/s/M3cvJ
因此,您可以简化条件检查,因为您不需要检查数组是否包含具有有效\u abc
的对象。您可以删除if/allOf[0]
,然后展开allOf
,因为它只有一个子模式。