JSONSchema中未计算条件格式

JSONSchema中未计算条件格式,json,jsonschema,Json,Jsonschema,我试图验证JSON中表示的防火墙规则 给出我的JSONSchema的一个最小示例,如下所示: { "$schema": "http://json-schema.org/draft-07/schema#", "title": "Example", "type": "object", "properties": { "from&

我试图验证JSON中表示的防火墙规则

给出我的JSONSchema的一个最小示例,如下所示:

{
  "$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"
      }
    }
  }
...
}