具有条件格式的jsonschema验证

时间:2018-10-24 19:46:15

标签: json validation jsonschema

我有一个要添加“格式”关键字的架构,但仅在某些情况下才可以。我有jsconschema草稿07,正在尝试使用if / else语句,但是,我想我开始意识到,使用if / else关键字时无法添加格式。

这是我的模式:

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "http://json-schema.org/draft-07/schema#",
  "title": "Core schema meta-schema",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "theToggler": {
      "type": "string"
    },
    "mysession": {
      "$ref": "#/definitions/mysession"
    }
  },
  "definitions": {
    "mysession": {
      "type": "object",
      "properties": {
        "theID": {
          "type": "string",
          "example": "test@email.om",
          "description": "no format"
        }
      }
    }
  },
  "if": {
    "theToggler": "testme"
  },
  "then": {
    "definitions": {
      "mysession": {
        "type": "object",
        "properties": {
          "theID": {
            "type": "string",
            "format": "email"
          }
        }
      }
    }
  }
}

这是我的输入内容:

{
  "theToggler": "testme",
  "mysession": {
    "theID": "test"
  }
}

您会认为这会抛出一个箭头(如果'theToggler'=“ testme”,则该ID应该带有@符号,因为我正在定义“电子邮件”格式。我是在做错什么,还是不支持此操作,还是看到其他我可能会想念的东西?

谢谢!

P.S。我正在https://www.jsonschemavalidator.net

中对其进行测试

1 个答案:

答案 0 :(得分:0)

您遇到了许多问题。

首先,您似乎已使用元架构作为示例。很好,但是您不能重用元模式的$id。您的架构必须具有唯一的$id或根本没有。

ifthen关键字必须是架构。如果实例针对if模式有效,则then模式也必须有效。

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "theToggler": { "type": "string" },
    "mysession": { "$ref": "#/definitions/mysession" }
  },
  "allOf": [
    {
      "if": { "$ref": "#/definitions/thetoggler-is-testme" },
      "then": { "$ref": "#/definitions/mysession-id-is-an-email" }
    }
  ],
  "definitions": {
    "mysession": {
      "type": "object",
      "properties": {
        "theID": {
          "type": "string",
          "example": "test@email.om",
          "description": "no format"
        }
      }
    },
    "thetoggler-is-testme": {
      "properties": {
        "theToggler": { "const": "testme" }
      }
    },
    "mysession-id-is-an-email": {
      "properties": {
        "mysession": {
          "properties": {
            "theID": { "format": "email" }
          }
        }
      }
    }
  }
}