具有A和B或C必需属性的对象的JSON模式

时间:2016-07-05 16:01:44

标签: jsonschema

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

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

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

在这两种情况下"文字"属性是可选的。其他属性是必需的("数字或两者"来自""来自")。

验证这一点的正确JSON模式是什么?

2 个答案:

答案 0 :(得分:8)

这是另一个我认为更清楚的解决方案。 dependencies子句确保"来自"和"到"永远都是一对。然后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"] }
  ]
}

答案 1 :(得分:0)

最后设法建立了正确的方案。

{
  "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"}
  ]
}