Python中的jsonschema验证未按预期工作

3

我正在使用Python 2.7的jsonschema验证方法来验证响应的JSON是否符合JSON模式。

我的JSON模式是一个字典,如下所示:

schema = {
    "type" : "object",
    "properties" : {
        "Country": {"type": "object",
                    "properties":{
                        "State" : { "type" : "object",
                                     "properties": {
                                     "city": {"type": "object",
                                                       "properties":{
                                                           "lat":{"type": "string"},
                                                           "long": {"type": "string"}
                                                           } 
                                                       },
                                    "StateCode": {"type": "string"},
                                    "StateFlagColor111": {"type": "string"},
                                    "StateCapital": {"type": "string"}
                                  }
                                }
                            }
                    }
                 }   
          }                                

我尝试根据这个模式验证的响应JSON是

{
  "Country":   {
  "State": {
    "City": {
      "lat": "PP_4001", 
      "long":  "Invalid GlobalParameters"
    }, 
  "StateCode": "2017-06-16 18:15:14.442000", 
  "StateFlagColor": "400", 
 "StateCapital": "ERROR"
  }
  }
}

验证json数据与json模式的Python代码片段如下:

   import jsonschema 
   from jsonschema import validate

   try:
       validate(responseDataJson, schema)            
       print 'good json'
   except jsonschema.exceptions.ValidationError as ve:
      print 'bad json' + str(ve)

如果您在模式中看到,元素的名称是StateFlagColor111,而JSON数据中的元素是stageFlagColor。我不确定为什么它不会因此验证而抛出异常。它总是通过。
然后,出于好奇,我创建了一个非常基本的jsonSchema,像这样尝试针对此新模式验证上述相同的josn数据。
schema1 = {
    "type": "object",
    "properties":{
        "x1":{"type":"string"}
        }
    }

该简单模式也可用于验证jsondata。

我不确定我漏掉了什么。我应该如何使它工作?

1个回答

11

默认情况下,模式允许对象包含您未明确指定的其他属性。 您需要在顶级和子对象 - State和City - 中添加"additionalProperties": False来禁用此功能。

另外,您的模式没有任何必填属性。 同样,如果要将任何属性作为必填属性,请在适当层次上使用required数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接