Arrays 验证相互依赖数组结构的JSON模式

Arrays 验证相互依赖数组结构的JSON模式,arrays,json,validation,jsonschema,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] } }

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

  • 它只能包含值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

等关键字。这样可以通过所有约束条件

{
  "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] } }
      }
    }
  }
}
如果您可以选择使用新的draft-06关键字
contains
const
,那么它实际上是一个非常干净的解决方案。有一点重复,但我认为这没有帮助

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

@tscherg它是一个包含单个值的枚举,该值为
[1]
。这是说
1
必须独立的最简单方式。这是因为
enum
不限于简单类型。我会接受你的答案,再次感谢。我快速浏览了一下,似乎还没有针对PHP的v6验证程序。你遇到过一个吗?@tscherg我在任何语言中见过的唯一一个支持draft-06的验证器是ajv,但它是针对JavaScript的。希望有人正在为PHPI开发一个,他们知道现场的人员目前正在审查v6验证的PR。看起来他们很接近,但还不太接近