jsonschema验证两个不同的json响应

时间:2019-03-26 15:06:22

标签: python json jsonschema

我有两个不同的JSON响应,每个都有不同的字段名,但是都使用jsonschema库成功地通过定义的模式进行了验证。

这是定义的模式

query_schema = {
    "type": "object",
    "properties" : {
        "pltfrm_nm": {"type" : "string"},
        "srvr_nm": {"type": "string"},
        "db_nm": {"type": "string"},
        "tbl_nm": {"type": "string"},
        "ip_addr_id": {"type": "string"},
        "usr_id": {"type": "string"},
        "sql_txt": {"type": "string"},
        "timestmp": {"type": "string"},
    },
}

这是两个不同的响应:

input = {'pltfrm_nm': 'p1', 'srvr_nm': 'server', 'db_nm': 'some db', 'tbl_nm': 'some table',
         'ip_addr_id': '999.999.9999', 'usr_id': 'my id', 'sql_txt': "sql text here", 'timestmp': 'aaaa)'}
validate(instance=input, schema=query_schema)

input = {'why': 'p1', 'does': 'server', 'this': 'some db', 'still': 'some table',
         'validate': '999.999.9999', 'i': 'my id', 'do': "sql text here", 'not': 'aaaa',
         'understand': 'hello'}
validate(instance=input, schema=query_schema)

在第二个输入中,我将所有字段命名为不同的字段,并且还添加了一个新字段understand。这些都不会引发ValidationError。这是库:https://pypi.org/project/jsonschema/。为什么第二个不抛出错误?

2 个答案:

答案 0 :(得分:1)

documentation指出:

  

默认情况下,提供其他属性有效:

     

additionalProperties关键字用于控制对   多余的东西,即名称未在   属性关键字。默认情况下,允许任何其他属性。

     

AdditionalProperties关键字可以是布尔值或对象。   如果AdditionalProperties是一个布尔值并将其设置为false,则没有其他   属性将被允许。

     

重用上面的示例,但是这次设置了额外的属性   为假。

因此,请尝试将其添加到您的query_schema

query_schema = {
    "type": "object",
    "properties" : {
        "pltfrm_nm": {"type" : "string"},
        "srvr_nm": {"type": "string"},
        "db_nm": {"type": "string"},
        "tbl_nm": {"type": "string"},
        "ip_addr_id": {"type": "string"},
        "usr_id": {"type": "string"},
        "sql_txt": {"type": "string"},
        "timestmp": {"type": "string"},
    },
  "additionalProperties": False
}

答案 1 :(得分:0)

JSON模式是基于约束的,而不是基于权限的。 空的JSON模式{}表示所有有效内容。

让我们看一下关键字properties所施加的约束...

  

对于两个同时出现的名称,验证成功   实例,并且作为该关键字值内的名称,子
  该名称的实例成功验证了
  相应的模式。

     

省略此关键字的行为与空对象相同。

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5.4

这意味着properties对象中键值的架构适用于JSON实例中的对应值。

以您的示例为例:

...    
    "properties" : {
            "pltfrm_nm": {"type" : "string"}
    }
...

pltfrm_nm必须是字符串。

这是上面代码段所暗示的唯一约束。

您是否期望proprties中未列出的密钥会导致验证错误? 如果是这样,则需要指定该事实。

要指定properties中定义的属性之外的其他属性,您需要使用additionalProperties

https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.5.6

我建议您在http://json-schema.org/understanding-json-schema/http://json-schema.org/understanding-json-schema/的学习资源中浏览一下,以了解JSON模式。