JSON模式:条件依赖

时间:2017-12-06 13:01:21

标签: json jsonschema

我似乎无法弄清楚如何在JSON模式中实现某些功能。我们假设我有两个字段:statusquote

条件依赖关系如下:

  • 如果status["Y", "N"],那么quote 必需
  • 如果status是enum的其他内容,则quote 不需要
  • 如果JSON中不存在status,则quote可以是任何

我正在尝试使用以下架构实现此行为:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "quote": {
      "type": "string",
    },

    "status": {
      "type": "string",
      "enum": ["Y", "N", "M", "A", "S"]
    }
  },

  "oneOf": [
      {
        "properties": {
          "status": {"enum": ["Y", "N"]}
        },
        "required": [
          "quote"
        ]
      },
      {
        "properties": {
          "status": {"enum": ["Y", "N", "M", "A", "S"]}
        }
      }
  ]
}

前两个条件按预期工作,但只要从JSON中遗漏status字段,验证就会失败。想要的行为是,只要quote字段不在那里,我就可以有一个字段status

我怎样才能做到这一点?

更新

所以我设法实现了我最初的要求,但是,我现在有了额外的要求。也就是说,只要authorstatus,我就会需要一个额外的字段["M", "A"],否则它只是可选的。如果status不存在,则quoteauthor都可以是任何内容。我尝试过如下:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object",
  "properties": {
    "quote": { "type": "string" },
    "author": { "type": "string" },
    "status": { "enum": ["Y", "N", "M", "A", "S"] }
  },
  "allOf": [
    { "$ref": "#/definitions/y-or-n-requires-quote" },
    { "$ref": "#/definitions/m-or-a-requires-author" }
  ],
  "definitions": {
    "y-or-n-requires-quote": {
      "anyOf": [
        { "not": { "$ref": "#/definitions/status-is-y-or-n" } },
        { "required": ["quote"] }
      ]
    },
    "m-or-a-requires-author": {
      "anyOf": [
        { "not": { "$ref": "#/definitions/status-is-m-or-a" } },
        { "required": ["author"] }
      ]
    },

    "status-is-y-or-n": {
      "properties": {
        "status": { "enum": ["Y", "N"] }
      }
    },

    "status-is-m-or-a": {
      "properties": {
        "status": { "enum": ["M", "A"] }
      }
    }
  }
}

但是,使用此架构并不适用于status不存在的JSON。

2 个答案:

答案 0 :(得分:1)

您需要使用一个名为implication(!A或B)的布尔逻辑概念。它是表达if-then约束的一种方式。在这种情况下,我们想要表达的是:要么状态不是" Y" /" N"或引用是必需的。

for i..

答案 1 :(得分:1)

请注意,草案07添加"如果" /"那么" /"否则"使条件更容易的关键字:

https://tools.ietf.org/html/draft-handrews-json-schema-validation-00#section-6.6

如果您的工具不支持draft-07,请考虑提交功能请求以便让他们更新: - )