使用JSON模式验证嵌套的数字/布尔列表

时间:2017-02-02 17:54:41

标签: json validation nested jsonschema

我不确定这是否可以使用JSON架构,但我的数据与此类似:

[1, 1, [0, 0, [true]], true]

如何验证[0,0,1]以便至少有一个项为1 / true?

到目前为止,我已设法创建模式:



{
  "type": "array",
  "items": {
    "$ref": "#/definitions/_items"
  },
  "definitions": {
    "_items": {
      "anyOf": [
        {
          "enum": [
            0,
            1
          ],
          "type": "integer"
        },
        {
          "enum": [
            false,
            true
          ],
          "type": "boolean"
        },
        {
          "type": "array",
          "items": {
            "anyOf": [
              {
                "$ref": "#/definitions/_items"
              }
            ]
          }
        }
      ]
    }
  }
}




显然它确实验证了所有接受的值,但它没有考虑到,如果有全部,一些,一个或没有值1 / true。我误解了,anyOf,allOf和oneOf都被保留了......

1 个答案:

答案 0 :(得分:2)

您需要的是contains个关键字。计划在下一版本的JSON Schema规范中添加。在实现之前,您可以在没有contains的情况下执行此操作,但逻辑有点复杂。我还清理了到目前为止你所拥有的一些不必要的东西。

{
  "type": "array",
  "items": { "$ref": "#/definitions/_items" },
  "allOf": [{ "$ref": "#/definitions/contains-1-or-true" }],
  "definitions": {
    "_items": {
      "anyOf": [
        { "enum": [0, 1] },
        { "type": "boolean" },
        { "$ref": "#" }
      ]
    },
    "contains-1-or-true": {
      "not": {
        "type": "array",
        "items": {
          "not": { "enum": [1, true] }
        }
      }
    }
  }
}