JSONSchema中未计算条件格式
我试图验证JSON中表示的防火墙规则 给出我的JSONSchema的一个最小示例,如下所示:JSONSchema中未计算条件格式,json,jsonschema,Json,Jsonschema,我试图验证JSON中表示的防火墙规则 给出我的JSONSchema的一个最小示例,如下所示: { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Example", "type": "object", "properties": { "from&
{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Example",
"type": "object",
"properties": {
"from": {
"$ref": "#/definitions/addressGroup"
},
"action": {
"type": "string",
"enum": ["binat", "pass"]
}
},
"allOf": [
{
"if": {
"properties": {
"action": {
"const": "binat"
}
}
},
"then": {
"properties": {
"from": {
"format": "ip-address"
}
}
}
}
],
"additionalProperties": false,
"required": [
"from",
"action"
],
"definitions": {
"addressGroup": {
"type": "string",
"pattern": "^[ !<a-zA-Z].+$"
}
}
}
但是对于这个JSON,“from”字段是根据addressGroup
计算的,而不是根据“格式”:“ip地址”
我希望触发“then”子句,并根据“ip地址”定义强制格式化“from”字段
可在此处找到最简单的演示:
我忽略了什么?对于draft-07,IP地址的指定格式是
ipv4
或ipv6
此外,format
默认情况下不执行任何操作,必须启用它
2019-09草案进一步澄清了这一点,并在2020-12草案中正式确定了可预测的行为
您可能必须在实现中启用它。我不确定jsonschemavalidator.net做什么,因为它不是开源的。jsonschema.dev未启用基于格式的验证
您已经正确地使用了if/then
,但是您的模式中的addressGroup
仍将被应用(不清楚这是否是您的意图)
根据您的评论进行更新:
要仅在if
架构失败时应用addressGroup
,需要使用else
关键字(if/then/else逻辑),将属性.表单移动到那里
{
"if": false,
"then": {},
"else": {
"properties": {
"from": {
"$ref": "#/definitions/addressGroup"
}
}
}
...
}
我懂了。我还将检查其他一些实现。我如何确保addressGroup不会被应用?理想情况下,我只希望在操作!='binat'
{
"action": "binat",
"from": "10.1.1.1"
}
{
"if": false,
"then": {},
"else": {
"properties": {
"from": {
"$ref": "#/definitions/addressGroup"
}
}
}
...
}