Использует ли валидатор jsonschema Python надстройку фактической jsonschema? - PullRequest
0 голосов
/ 03 декабря 2018

При использовании 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 Ответ

0 голосов
/ 04 декабря 2018

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

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

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

...