【问题标题】:JSON schema for object with either A and B or C required properties具有 A 和 B 或 C 必需属性的对象的 JSON 模式
【发布时间】:2016-11-07 13:19:04
【问题描述】:

对于一个请求,我有两个可能的 JSON 对象:

{
  "from": "string",
  "to": "string",
  "text": "string"
}

{
  "number": "integer",
  "text": "string"
}

在这两种情况下,“文本”属性都是可选的。需要其他属性(“数字”或“从”和“到”两者)。

验证这一点的正确 JSON 架构是什么?

【问题讨论】:

标签: jsonschema


【解决方案1】:

这是另一个我认为更清楚的解决方案。 dependencies 子句确保“from”和“to”总是成对出现。那么oneOf 子句可以非常简单,避免不必要的样板。

{
  "type": "object",
  "properties": {
    "from": { "type": "string" },
    "to": { "type": "string" },
    "number": { "type": "integer" },
    "text": { "type": "string" }
  },
  "dependencies": {
    "from": ["to"],
    "to": ["from"]
  },
  "oneOf": [
    { "required": ["from"] },
    { "required": ["number"] }
  ]
}

【讨论】:

  • 不错!非常感谢
  • 那太丑了!...认为会有更好的方法来做到这一点。也许使用像type:"#from_to | #num_text"这样的参考
【解决方案2】:

终于设法建立了正确的方案。

{
  "definitions": {
    "interval": {
      "type": "object",
      "properties": {
        "from": {
          "type": "string"
        },
        "to": {
          "type": "string"
        },
        "text": {
          "type": "string"
        }
      },
      "required": ["from", "to"],
      "not": {
        "required": ["number"]
      }
    },
    "top": {
      "type": "object",
      "properties": {
        "number": {
          "type": "integer"
        },
        "text": {
          "type": "string"
        }
      },
      "required": ["number"],
      "allOf": [
        {
          "not": {
            "required": ["from"]
          }
        },
        {
          "not": {
            "required": ["to"]
          }
        }
      ]

    }
  },
  "type": "object",
  "oneOf": [
    {"$ref": "#/definitions/interval"},
    {"$ref": "#/definitions/top"}
  ]
}

【讨论】:

    最近更新 更多