1

使用 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 库标记为错误?我阅读了文档,但在这一点上找不到提及。

4

1 回答 1

1

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

所以是的,有一些 Python dicts 是你可以构建的,它们永远不可能来自 JSON,就像你在那里的那个。

虽然jsonschema.validate采用的类型是 dict-that-c​​ome-from-JSON,所以是的,如果你给它一个永远不可能是 JSON 的类型,你会得到意想不到的结果(例如,jsonschema 的当前或未来版本是免费的假设所有键都已经是字符串,并且您可能会在尝试执行字符串操作而不先转换的地方看到 TypeErrors)。

于 2018-12-04T16:41:49.330 回答