在python

时间:2018-08-31 08:11:02

标签: python json validation jsonschema json-schema-validator

首先,我在Web平台上也没有得到正确的错误响应(https://jsonschemalint.com)。我在python中使用jsonschema,并且具有正确的json模式和json数据有效。

我要解决的问题如下:在提供带有示例数据的JSON文件之前,我们需要通过SoapUI运行它们以测试它们是否正确,因为我们正在处理大型文件,通常我们的开发人员可能在生成它们时会出错,所以我们进行最后检查。

我想创建一个脚本来自动执行此操作,避免使用SoapUI。因此,在谷歌搜索之后,我遇到了jsonschema,并尝试使用它。我得到了所有正确的结果,等等,像往常一样删除某些元素时出现错误,但是最大的问题如下:

示例: 我的JSON模式中有一个subsubsub对象,我们称它为Test1,它包含以下内容:

**Schema**
    {
   "exname":"2",
   "info":{},
   "consumes":{},
   "produces":{},
   "schemes":{},
   "tags":{},
   "parameters":{},
   "paths":{},
   "definitions":{
      "MainTest1":{
         "description":"",
         "minProperties":1,
         "properties":{
            "test1":{
               "items":{
                  "$ref":"#//Test1"
               },
               "maxItems":10,
               "minItems":1,
               "type":"array"
            },
            "test2":{
               "items":{
                  "$ref":"#//"
               },
               "maxItems":10,
               "minItems":1,
               "type":"array"
            }
         }
      },
      "Test1":{
         "description":"test1des",
         "minProperties":1,
         "properties":{
            "prop1":{
               "description":"prop1des",
               "example":"prop1exam",
               "maxLength":10,
               "minLength":2,
               "type":"string"
            },
            "prop2":{
               "description":"prop2des",
               "example":"prop2example",
               "maxLength":200,
               "minLength":2,
               "type":"string"
            },
            "prop3":{
               "enum":[
                  "enum1",
                  "enum2",
                  "enum3"
               ],
               "example":"enum1",
               "type":"string"
            }
         },
         "required":[
            "prop3"
         ],
         "type":"object"
      }
   }
}

    **Proper example for Test1** 
    {
    "Test1": [{
        "prop1": "TestStr",
        "prop2": "Test and Test",
        "prop3": "enum1"
    }]
    }

    **Improper example that still passes validation for Test1** 
    {
    "test1": [{
        "prop1": "TestStr123456", [wrong as it passes the max limit]
        "prop2": "Test and Test",
        "prop3": " enum1" [wrong as it has a whitespace char before enum1]
    }]
    }

我遇到的第一个问题是prop3中的枚举未正确验证。因此,当我使用“ enum1”或“ enumruwehrqweur”或“任何文字”时,测试就会通过。另外,整个我的JSON都不会检查最小-最大字符。无论我在任何字段中使用多少个字符,我都不会出错。任何人都知道如何解决此问题,还是有人找到了更好的解决方法来完成我想做的事情?预先谢谢你!

1 个答案:

答案 0 :(得分:1)

您的架构存在一些问题。我会分别给他们讲。

在您的模式中,您具有“ Test1”。在您的JSON实例中,您具有“ test1”。案例很重要。我想这只是创建您的示例时的错误。

在架构中,您在根级别具有“ Test1”。因为这不是架构关键字,所以将其忽略,并且对验证没有影响。您需要像在其他地方一样将其嵌套在“属性”对象中。

{
  "properties": {
    "test1": {

您的验证仍然无法正常工作。如果要验证数组中的每个项目,则需要使用items关键字。

{
  "properties": {
    "test1": {
      "items": {
        "description": "test1des",

最后,您需要将requiredtype关键字嵌套在items对象中。

这是完整的架构:

{
  "properties": {
    "test1": {
      "items": {
        "description": "test1des",
        "minProperties": 1,
        "properties": {
          "prop1": {
            "description": "prop1des",
            "example": "prop1exam",
            "maxLength": 10,
            "minLength": 2,
            "type": "string"
          },
          "prop2": {
            "description": "prop2des",
            "example": "prop2example",
            "maxLength": 200,
            "minLength": 2,
            "type": "string"
          },
          "prop3": {
            "enum": [
              "enum1",
              "enum2",
              "enum3"
            ],
            "example": "enum1",
            "type": "string"
          }
        },
        "required": [
          "prop3"
        ],
        "type": "object"
      }
    }
  }
}