JSON Schema验证相互依赖的数组结构

时间:2017-06-16 13:14:30

标签: arrays json validation jsonschema

我正在尝试编写一个验证具有以下结构约束的数组的模式:

  • 它只能包含值1,2,3,4,5
  • 如果数组包含1,则必须是唯一的条目
  • 该阵列只能同时包含2,3或4个,例如[2,3]是不允许的
  • 5可以与2,3,4
  • 一起存在

所以有效数组是

[1],
[2],
[3],
[4],
[5],
[2,5],
[3,5],
[4,5]

我开始编写如下架构:

{
    "type": "array",
    "oneOf": [
        { "items": { "enum": [1] } },
        {
            "anyOf": [
                ???
            ]
        }
    ]
}

我无法让???部分工作。有可能吗? 注意:我想避免硬编码所有可能的数组,因为我必须验证更复杂的结构 - 这只是一个例子。此外,最佳解决方案是仅使用anyOf, allOf, oneOf, not的解决方案,避免使用minItems 等关键字

1 个答案:

答案 0 :(得分:1)

这会传递所有约束。

{
  "type": "array",
  "anyOf": [
    { "enum": [[1]] },
    {
      "items": { "enum": [2, 3, 4, 5] },
      "oneOf": [
        { "$ref": "#/definitions/doesnt-contain-2-3-or-4" },
        { "$ref": "#/definitions/contains-2" },
        { "$ref": "#/definitions/contains-3" },
        { "$ref": "#/definitions/contains-4" }
      ]
    }
  ],
  "definitions": {
    "doesnt-contain-2-3-or-4": {
      "items": { "not": { "enum": [2, 3, 4] } }
    },
    "contains-2": {
      "not": {
        "items": { "not": { "enum": [2] } }
      }
    },
    "contains-3": {
      "not": {
        "items": { "not": { "enum": [3] } }
      }
    },
    "contains-4": {
      "not": {
        "items": { "not": { "enum": [4] } }
      }
    }
  }
}

如果您可以选择使用新的草案-06关键字containsconst,那么它实际上是一个非常干净的解决方案。有一点重复,但我认为这不会有帮助。

{
  "type": "array",
  "anyOf": [
    { "const": [1] },
    {
      "items": { "enum": [2, 3, 4, 5] },
      "oneOf": [
        { "not": { "contains": { "enum": [2 ,3, 4] } } },
        { "contains": { "const": 2 } },
        { "contains": { "const": 3 } },
        { "contains": { "const": 4 } }
      ]
    }
  ]
}