Использует ли валидатор 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? Я прочитал документы, но не смог найти упоминания по этому вопросу.

1 ответ

Решение

Библиотека jsonschema Python, как и большинство библиотек JSON Schema, фактически не работает с JSON. JSON это текст. Библиотеки JSON Schema обычно работают с объектами уровня языка, в которые библиотеки JSON десериализуются.

Так что да, есть Python-диктовки, которые вы можете создать, которые никогда не могли бы прийти из JSON, как тот, который у вас есть.

Тип, хотя это jsonschema.validate take is dict-that-came-from-JSON, так что да, если вы дадите ему тот, который никогда не будет JSON, вы получите неожиданные результаты (например, текущая или будущая версия jsonschema может предполагать, что все ключи уже строки, и вы можете увидеть TypeErrors из мест, пытающихся выполнить строковые операции без предварительного преобразования).

Другие вопросы по тегам