我有两个不同的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/。为什么第二个不抛出错误?
答案 0 :(得分:1)
默认情况下,提供其他属性有效:
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模式。