【问题标题】:JSON Schema to validate interdependent array structureJSON Schema 来验证相互依赖的数组结构
【发布时间】:2017-06-16 13:14:29
【问题描述】:

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

  • 它只能包含值 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 之类的关键字

【问题讨论】:

    标签: arrays json validation jsonschema


    【解决方案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] } }
          }
        }
      }
    }
    

    如果您可以选择使用新的 draft-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 } }
          ]
        }
      ]
    }
    

    【讨论】:

    • @tscherg 这是一个包含单个值的枚举,该值是[1]。这是说1 必须独立存在的最简单的方法。这是因为enum 不限于简单类型。
    • 我会接受你的回答,再次感谢。我快速浏览了一下,似乎还没有用于 PHP 的 v6 验证器。你遇到过吗?
    • @tscherg 我在任何支持draft-06的语言中看到的唯一验证器是ajv,但那是针对JavaScript的。希望有人在为 PHP 开发一个
    • 我知道github.com/justinrainbow/json-schema 的人们目前正在审查 PR 以进行 v6 验证。似乎他们很接近,但还没有到那里
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2016-01-10
    • 1970-01-01
    相关资源
    最近更新 更多