JSON模式报告错误仅针对数组的第一个元素

时间:2018-07-27 11:37:06

标签: json jsonschema

我有下面的JSON文档。

[
    {
        "name": "aaaa",
        "data": {
            "key": "id",
            "value": "aaaa"
        }
    },
    {
        "name": "bbbb",
        "data": {
            "key": "id1",
            "value": "bbbb"
        }
    }
]

下面是我为上述内容创建的JSON模式。

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "array",
  "items": [
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "data": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "enum": [
                "id",
                "temp",             
              ]
            },
            "value": {
              "type": "string",
            }
          },
          "required": [
            "key",
            "value"
          ]
        }
      },
      "required": [
        "name",
        "data"
      ]
    }
  ]
}

根据架构,data.key的值对于数组中的第二项无效。但是任何在线模式验证器都找不到。如果我们在第一个数组元素中使用不同的值,则会引发例外错误。

我认为我的模式有某种错误。我期望的是,如果数组的任何子项的值都超出枚举列表,则应该报告它们。

1 个答案:

答案 0 :(得分:2)

这是一个容易犯的错误,所以不要为这个而beat不休!

items可以是数组或对象。如果是数组,它将验证实例数组中该位置的对象。这是JSON模式规范的摘要(草稿7)

  

“ items”的值必须是有效的JSON模式或一个数组   有效的JSON模式。

     

如果“ items”是模式,则如果   阵列针对该架构成功验证。

     

如果“ items”是模式数组,则每个元素的验证都将成功   实例的实例针对同一位置的架构进行验证,如果   任何。

JSON Schema (validation) draft-7 items

删除方括号可为您提供正确的架构...

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "array",
  "items": 
    {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "data": {
          "type": "object",
          "properties": {
            "key": {
              "type": "string",
              "enum": [
                "id",
                "temp",             
              ]
            },
            "value": {
              "type": "string",
            }
          },
          "required": [
            "key",
            "value"
          ]
        }
      },
      "required": [
        "name",
        "data"
      ]
    }

}