Warm tip: This article is reproduced from serverfault.com, please click

jsonschema-JSON Schema 仅针对数组的第一个元素报告错误

(jsonschema - JSON Schema reporting error only for first element of array)

发布于 2018-07-27 11:37:05

我有以下 JSON 文档。

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

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

{
  "$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 的值对于数组中的第二项无效。但任何在线模式验证器都找不到。如果我们在第一个数组元素中使用不同的值,则会引发异常错误。

我假设我的模式在某种程度上是错误的。我期望的是,如果数组的任何子项具有枚举列表之外的值,则应该报告它们。

Questioner
Purus
Viewed
0
Bot 2021-10-07 15:24:50

这是一个容易犯的错误,所以不要因为这个而自责!

items可以是数组或对象。如果它是一个数组,它会验证实例数组中该位置的对象。这是 JSON Schema 规范(draft-7)的摘录

“items”的值必须是有效的 JSON Schema 或有效 JSON Schema 的数组。

如果“items”是一个模式,则如果数组中的所有元素都成功地针对该模式进行验证,则验证成功。

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

JSON 模式(验证)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"
      ]
    }
  
}