使用Python jsonschema时,可以定义无法用有效JSON表示的架构和实例。
>>> import jsonschema
>>> schema = {
... "type": "object",
... "properties": {"1": {}, 2:{}},
... "additionalProperties": False
... }
现在
>>> jsonschema.validate({"1": "spam", 2: "eggs"}, schema)
不会引发异常,而下面的代码将失败:
>>> jsonschema.validate({1: "spam"}, schema)
Traceback (most recent call last):
...
jsonschema.exceptions.ValidationError: Additional properties are not allowed (1 was unexpected)
Failed validating 'additionalProperties' in schema:
{'additionalProperties': False,
'properties': {2: {}, '1': {}},
'type': 'object'}
On instance:
{1: 'spam'}
我在这里有些困惑:Python映射{"1": "spam", 2: "eggs"}
无法在有效的JSON对象中序列化,以上的schema
映射也是如此。 (在JSON对象中是名称/值映射,其中名称必须是字符串,并且不能是整数或其他数据类型。)
这是否是预期的行为,即jsonschema语义已扩展为包括更通用的python数据类型,还是上述schema
的使用无效,并且jsonschema库应将其标记为错误?我读过docs,但此刻找不到提及。
答案 0 :(得分:1)
Python jsonschema库与大多数JSON Schema库一样,实际上并不在JSON上运行。 JSON是文本。 JSON模式库通常在语言级别的对象上运行,这些对象是JSON库反序列化到的对象。
所以,是的,您可以构造一些Python字典,而这些字典不可能像JSON那样来自JSON。
尽管jsonschema.validate
所采用的类型是dict-that-from-JSON,所以是的,如果您给它提供了一个永远不可能是JSON的类型,那么您将得到意想不到的结果(例如,当前或jsonschema的未来版本可以自由地假设所有键都已经是字符串,并且您可能会从尝试执行字符串操作而不先进行转换的地方看到TypeErrors。