验证 JSON 至少一个包含特定值的架构属性

Validate JSON Schema properties with at least one containing specific value

我想知道我是否可以定义一个 JSON 模式(草案 4),它至少需要许多属性中的一个具有特定值。

为了说明,这里有一个例子JSON我希望FAIL验证:

{
    "daysOfWeek": {
        "mon": false,
        "tue": false,
        "wed": false,
        "thu": false,
        "fri": false,
        "sat": false,
        "sun": false
    }
}

但是,如果上述属性中的任何(一个或多个)设置为 true,只有到那时我才希望它通过验证。

那么 Schema 是什么?

{
    "daysOfWeek": {
        "type": "object",
        "properties": {
            "mon": { "type": "boolean" },
            "tue": { "type": "boolean" },
            "wed": { "type": "boolean" },
            "thu": { "type": "boolean" },
            "fri": { "type": "boolean" },
            "sat": { "type": "boolean" },
            "sun": { "type": "boolean" }
        },
        "anyOf": [{
            // ?
        }]
    }
}

非常感谢!

您可以使用 enum 关键字来指定 属性 具有特定值。您可以将该技巧与 anyOf 结合使用以获得所需的验证行为。

{
  "type": "object",
  "properties": {
    "daysOfWeek": {
      "type": "object",
      "properties": {
        "mon": { "type": "boolean" },
        "tue": { "type": "boolean" },
        "wed": { "type": "boolean" },
        "thu": { "type": "boolean" },
        "fri": { "type": "boolean" },
        "sat": { "type": "boolean" },
        "sun": { "type": "boolean" }
      },
      "anyOf": [
        {
          "properties": {
            "mon": { "enum": [true] }
          }
        },
        {
          "properties": {
            "tue": { "enum": [true] }
          }
        },
        {
          "properties": {
            "wed": { "enum": [true] }
          }
        },
        {
          "properties": {
            "thu": { "enum": [true] }
          }
        },
        {
          "properties": {
            "fri": { "enum": [true] }
          }
        },
        {
          "properties": {
            "sat": { "enum": [true] }
          }
        },
        {
          "properties": {
            "sun": { "enum": [true] }
          }
        }
      ]
    }
  }
}

@Jason 的回答对于您这里的案例来说很好(并且可读)。在一般情况下(您可能拥有任意数量的属性),有一种更简洁的方式(但可读性较差):

您可以将您的要求改写为 "The properties are not all allowed to be false",在这种情况下,模式可以是:

{
    "type": "object",
    "properties": {...},
    "not": {
        "additionalProperties": {"enum": [false]}
    }
}

additionalProperties 在子架构中,因此它未连接到根级别的 properties 值。因此它适用于所有属性。

not 内的子模式只有在所有属性都是 false 时才会通过 - 因此外部模式只有在 不是 所有属性都是 false.