我正在使用AJV
来尝试验证某些数据,并根据其他属性的值动态地请求属性。
我要验证的是:
-始终需要enabled
,
-如果enabled
= true
,则仅必须提供其他属性之一(realtime
,threshold
或digest
)
有效载荷样本和预期结果:
应该通过
{
"notifications": {
"enabled": false
}
}
应该通过
{
"notifications": {
"enabled": true,
"realtime": true
}
}
应该通过
{
"notifications": {
"enabled": true,
"digest": true
}
}
应该通过
{
"notifications": {
"enabled": true,
"threshold": {}
}
}
应该失败,因为enabled
= true
,但未设置其他属性。
{
"notifications": {
"enabled": true
}
}
应该失败,因为enabled
= true
并且设置了一个以上的其他属性。
{
"notifications": {
"enabled": true,
"threshold": {},
"digest: true
}
}
这是我使用的验证模式:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Settings",
"type": "object",
"properties": {
"notifications": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"realtime": {
"type": "boolean"
},
"threshold": {
"type": "object",
"properties": {
"detections": {
"type": "number"
},
"elapsed": {
"type": "number"
}
},
"required": ["detections", "elapsed"]
},
"digest": {
"type": "boolean"
}
},
"required": ["enabled"],
"if": {
"properties": { "enabled": true }
},
"then": {
"oneOf": [
{ "required": [ "realtime" ] },
{ "required": [ "threshold" ] },
{ "required": [ "digest" ] }
]
}
}
}
}
谢谢!
答案 0 :(得分:1)
结果证明我非常亲密,问题在于如何评估if
的{{1}}语句。这是按预期验证(通过和失败)以上所有示例的正确架构:
true
这部分起到了作用:
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Settings",
"type": "object",
"properties": {
"notifications": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"realtime": {
"type": "boolean"
},
"threshold": {
"type": "object",
"properties": {
"detections": {
"type": "number"
},
"elapsed": {
"type": "number"
}
},
"required": ["detections", "elapsed"]
},
"digest": {
"type": "boolean"
}
},
"required": ["enabled"],
"if": {
"enabled": {
"const": true
}
},
"then": {
"oneOf": [
{
"required": ["realtime"]
},
{
"required": ["threshold"]
},
{
"required": ["digest"]
}
]
}
}
}
}