JSON 具有 A 和 B 或 C 必需属性的对象的架构

JSON schema for object with either A and B or C required properties

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

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

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

在这两种情况下,"text" 属性 是可选的。需要其他属性("number, or both "from" 和 "to")。

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

终于成功建立了正确的方案。

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

这是我认为更清楚一点的另一种解决方案。 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"] }
  ]
}