【问题标题】:Validate JSON Schema properties with at least one containing specific value使用至少一个包含特定值的 JSON Schema 属性来验证
【发布时间】:2015-11-04 10:21:20
【问题描述】:

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

为了说明,这里是一个我希望 FAIL 验证的示例 JSON:

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

但如果上述任何(一个或多个)属性设置为true,那么我希望它通过验证。

那么架构是什么?

{
    "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": [{
            // ?
        }]
    }
}

非常感谢!

【问题讨论】:

    标签: json jsonschema


    【解决方案1】:

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

    您可以将您的要求改写为“属性不允许全部为假”,在这种情况下,架构可能是:

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

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

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

    【讨论】:

    • 此答案的优势在于它不需要您知道键名的所有可能值(如果大小写不同于daysOfWeek)。
    【解决方案2】:

    您可以使用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] }
              }
            }
          ]
        }
      }
    }
    

    【讨论】:

    • 我知道我不应该简单地说“谢谢”,但我必须这样做,因为这正是我的想法,而你做到了。但我“接受”了 cloudfeet 的答案,因为它帮助我从不同的角度看待同一个问题,开箱即用……所以 +1,谢谢 Jason!
    猜你喜欢
    • 2018-02-16
    • 2018-04-18
    • 2017-07-05
    • 1970-01-01
    • 2020-09-16
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    相关资源
    最近更新 更多