JSON模式验证草案-07中的“ minContains”和“ maxContains”的解决方法?

时间:2020-08-06 12:49:32

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

最新的JSON模式验证版本(2019-09)允许使用 contains 关键字放置条件(子模式),以及该条件可以出现多少次在JSON模式中使用 minContains maxContains 。该功能在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"]
     }
  }
}

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

2 个答案:

答案 0 :(得分:1)

没有,这就是为什么我们为草稿2019-09添加了关键字。抱歉。

答案 1 :(得分:0)

在草案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 }
      }
    }
  }
}