【问题标题】:Python jsonschema validate not working as expectedPython jsonschema 验证未按预期工作
【发布时间】:2017-06-16 22:27:59
【问题描述】:

我正在使用 python 2.7 jsonschema validate 方法来验证针对 jsonSchema 的响应 json。

我的 jsonSchema 是一个字典如下:

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 代码 sn-p 是

   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 也针对这个简单的模式进行了验证。

我不确定我在这里缺少什么。我应该如何完成这项工作?

【问题讨论】:

    标签: python


    【解决方案1】:

    默认情况下,模式将允许对象包含您未明确指定的其他属性。您需要在顶层和子对象(州和城市)内部添加 "additionalProperties": False 以禁用此功能。

    此外,您的架构没有任何必需的属性。同样,如果您需要任何属性,则需要适当级别的 required 数组。

    【讨论】:

      猜你喜欢
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多