【问题标题】:Workaround for "minContains" & "maxContains" in JSON Schema validation draft-07?JSON Schema验证draft-07中“minContains”和“maxContains”的解决方法?
【发布时间】:2020-08-06 12:49:32
【问题描述】:

最新的 JSON 模式验证版本 (2019-09) 允许使用 contains 关键字放置条件(子模式)以及该条件可以出现多少次在 JSON 模式中使用 minContainsma​​xContains。此功能在 Draft-07 中不可用。有没有办法在不使用这些关键字的情况下实现这一目标?例如

"answers": [
    {
      "id": 1,
      "text": "choice1",
      "isCorrect": true
    },
    {
      "id": 1,
      "text": "choice2",
      "isCorrect": false
    },
    {
      "id": 1,
      "text": "choice3",
      "isCorrect": false
    },
    {
      "id": 1,
      "text": "choice4",
      "isCorrect": false
    }
  ]
}

包含的条件如下:

"contains":{
  "properties":{
    "isCorrect":{
      "enum":["true"]
     }
  }
}

这会检查isCorrect 是否为true 至少一次。但是,如果我希望验证仅在 isCorrect 的值至少为 true 两次时通过,我该如何实现呢? 任何帮助表示赞赏!谢谢。

【问题讨论】:

    标签: json validation contains jsonschema json-schema-validator


    【解决方案1】:

    不,没有,这就是我们为草稿2019-09 添加关键字的原因。对不起。

    【讨论】:

      【解决方案2】:

      在draft-07 中并没有真正模拟minContains/maxContains 的方法。以下是您可以获得的最接近的一些示例。

      就像"minContains": 2,如果你有固定数量的元素。它并不漂亮,但是您可以枚举这两个项目在数组中出现的所有可能方式。

      {
        "type": "array",
        "maxItems": 4,
        "minItems": 4,
        "anyOf": [
          {
            "items": [
              { "$ref": "#/definitions/isCorrect-true" },
              { "$ref": "#/definitions/isCorrect-true" }
            ]
          },
          {
            "items": [
              { "$ref": "#/definitions/isCorrect-true" },
              true,
              { "$ref": "#/definitions/isCorrect-true" }
            ]
          },
          {
            "items": [
              { "$ref": "#/definitions/isCorrect-true" },
              true,
              true,
              { "$ref": "#/definitions/isCorrect-true" }
            ]
          },
          {
            "items": [
              true,
              { "$ref": "#/definitions/isCorrect-true" },
              { "$ref": "#/definitions/isCorrect-true" }
            ]
          },
          {
            "items": [
              true,
              { "$ref": "#/definitions/isCorrect-true" },
              true,
              { "$ref": "#/definitions/isCorrect-true" }
            ]
          },
          {
            "items": [
              true,
              true,
              { "$ref": "#/definitions/isCorrect-true" },
              { "$ref": "#/definitions/isCorrect-true" }
            ]
          }
        ],
        "definitions": {
          "isCorrect-true": {
            "type": "object",
            "properties": {
              "isCorrect": { "const": true }
            }
          }
        }
      }
      

      "minContains": 2 类似,除了所有true 项都需要在数组中排在第一位。

      {
        "type": "array",
        "items": [
          { "$ref": "#/definitions/isCorrect-true" },
          { "$ref": "#/definitions/isCorrect-true" }
        ],
        "definitions": {
          "isCorrect-true": {
            "type": "object",
            "properties": {
              "isCorrect": { "const": true }
            }
          }
        }
      }
      

      类似于"maxContains": 2,除了true 的所有项都需要在数组中排在第一位。

      {
        "type": "array",
        "items": [
          true,
          true
        ],
        "additionalItems": { "not": { "$ref": "#/definitions/isCorrect-true" } },
        "definitions": {
          "isCorrect-true": {
            "type": "object",
            "properties": {
              "isCorrect": { "const": true }
            }
          }
        }
      }
      

      "minContains": 2, "maxContains": 2 类似,但所有true 项都需要在数组中排在第一位。

      {
        "type": "array",
        "items": [
          { "$ref": "#/definitions/isCorrect-true" },
          { "$ref": "#/definitions/isCorrect-true" }
        ],
        "additionalItems": { "not": { "$ref": "#/definitions/isCorrect-true" } },
        "definitions": {
          "isCorrect-true": {
            "type": "object",
            "properties": {
              "isCorrect": { "const": true }
            }
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-06-18
        • 1970-01-01
        • 1970-01-01
        • 2018-12-11
        • 2018-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多