如何制作jsonschema以便验证数组中的所有对象?

时间:2018-03-16 11:28:20

标签: json jsonschema

我正在尝试使用json-schema验证JSON输入,但它不能像我需要的那样工作。

我有以下输入JSON(部分内容):

[
  {
    "admin_state": "disabled"
  },
  {
    "state": "disabled"
  }
]

以下json-schema(也是其中的一部分):

{
  "type": "array",
  "items": [
    {
      "type": "object",
      "properties": {
        "admin_state": {
          "type": "string",
          "default": "enabled",
          "enum": [
            "disabled",
            "enabled"
          ]
        }
      },
      "additionalProperties": false
    }
  ],
  "minItems": 1
}

我希望验证失败,因为不应该允许“state”属性(感谢“additionalProperties”:false 选项)

但是,我可以在数组的第二项中添加/更改任何内容,验证总是成功的。当我在第一项中更改任何内容时,验证失败(按预期)。

我错过了什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

JSON Schema draft 7(当前最新)声明......

  

如果"项目"是一个模式,验证成功,如果所有元素   数组成功验证该模式。

     

如果"项目"是一个模式数组,如果每个元素验证成功   如果实例的实例在相同位置验证模式   任何

在您的架构中,items是一个数组,这意味着您只将该数组中的subschem应用于实例数组的第一个元素。只需从items中删除方括号,您的子模式将适用于实例中的所有项目。

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "admin_state": {
        "type": "string",
        "default": "enabled",
        "enum": [
          "disabled",
          "enabled"
        ]
      }
    },
    "additionalProperties": false
  },
  "minItems": 1
}