Python jsonschema验证程序是否使用实际jsonschema的超集?

时间:2018-12-02 21:19:16

标签: python jsonschema python-jsonschema

使用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,但此刻找不到提及。

1 个答案:

答案 0 :(得分:1)

Python jsonschema库与大多数JSON Schema库一样,实际上并不在JSON上运行。 JSON是文本。 JSON模式库通常在语言级别的对象上运行,这些对象是JSON库反序列化到的对象。

所以,是的,您可以构造一些Python字典,而这些字典不可能像JSON那样来自JSON。

尽管jsonschema.validate所采用的类型是dict-that-from-JSON,所以是的,如果您给它提供了一个永远不可能是JSON的类型,那么您将得到意想不到的结果(例如,当前或jsonschema的未来版本可以自由地假设所有键都已经是字符串,并且您可能会从尝试执行字符串操作而不先进行转换的地方看到TypeErrors。