minItems似乎没有在JSON模式中正确验证

时间:2015-04-28 09:48:03

标签: arrays json validation jsonschema

我正在编写一个简单的JSON模式,并使用elif (postcode[0]) == str(1) or (postcode[0]) == str(2) or (postcode[0]) == str(5):来验证给定数组中的项目数。我的架构如下:

if (postcode[0]) == "0" or (postcode[0]) == "6":
    billing = 25

elif (postcode[0]) == "1" or (postcode[0]) == "2" or (postcode[0]) == "5":
    billing = 15

elif (postcode[0]) == "3":
    billing = 12

else:
    billing = 20

现在我希望以下JSON验证失败,因为元素minItems中没有任何内容。但是当使用this online validator时,它会通过。我做错了什么,或者我使用错误的架构验证器?

{
"title": "My Schema",
"type": "object",
"properties": {
    "root": {
        "type": "array",
        "properties": {
            "id": {
                "type": "string"
            },
            "myarray": {
                "type": "array",
                "items": {
                    "type": "string"
                },
                "minItems": 4,
                "uniqueItems": true
            },
            "boolean": {
                "type": "boolean"
            }
        },
        "required": ["id","myarray","boolean"]
    }
},
"required": [
    "root"
],
"additionalProperties": false
}

2 个答案:

答案 0 :(得分:1)

我不确定为什么或它被称为什么,但是您的要求的正确架构定义应该如下所示。

根据我对JSON Schema定义的理解,您应该在items声明中声明数组的属性。在您的模式中,您可以在数组项声明之外定义属性。

在您的架构中,您有两种不同类型的数组声明:

  • 只有一个对象(" myarray"对象的字符串)
  • 使用复杂对象(对象名称" myComplexType"在下面的代码中)

查看两者的定义,它们的结构以及如何解释它们。

更正后的架构:

{
  "title": "My Schema",
  "type": "object",
  "properties": {
    "root": {
      "type": "array",
      "items": {                  <-- Difference here - "items" instead of "properties"
        "type": "object",         <-- here - define the array items as a complex object
        "title": "myComplexType", <-- here - named for easier referencing
        "properties": {           <-- and here - now we can define the actual properties of the object
          "id": {
            "type": "string"
          },
          "myarray": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 4,
            "uniqueItems": true
          },
          "boolean": {
            "type": "boolean"
          }
        }
      },
      "required": [
        "id",
        "myarray",
        "boolean"
      ]
    }
  },
  "required": [
    "root"
  ],
  "additionalProperties": false
}

删除我在复制到您的代码时添加<--的评论,添加以指示更改的位置。

作为一个说明,我确实不明白为什么验证人没有为“格式错误”提供错误。架构,但可能就是它看到了定义,因为你将它作为附加属性,并不完全确定。

答案 1 :(得分:0)

您的架构唯一的问题是root属性应该是object而不是array。由于未为数组定义properties关键字,因此将忽略该关键字。因此,您尝试测试的模式部分完全被忽略,即使它是正确的。

以下是规范中的相关段落

  

某些验证关键字仅适用于一种或多种基本类型。当实例的原始类型无法通过给定关键字验证时,此关键字和实例的验证应该成功。