Как я могу получить отсутствующие поля из файла JSON в схеме и наоборот - PullRequest
0 голосов
/ 25 марта 2019

Я установил jsonschema, используя pip install jsonschema.

from jsonschema import validate

schema_data = {
    "type" : "object",
    "properties" : {
        "price" : {"type" : "number"},
        "name" : {"type" : "string"},
        "additional" : {"type" : "number"},
        },
    }

json_data = {"name" : "Eggs", "price" : 34.99, "new": 90}

У меня выше schema_data и json_data, что только подтверждает тип данных.

Здесь additional - это дополнительное поле в schema_data, которое отсутствует в json_data, и new присутствует в json_data, которое отсутствует в schema_data.

Как я могу перечислить пропущенные поля, такие как additional отсутствует в json_data и new отсутствует в schema_data?

1 Ответ

2 голосов
/ 25 марта 2019

В JSON-схеме по умолчанию свойства не обязательны , все, что делает ваша схема, это указывает, какого типа они должны быть , если свойство присутствует .Поэтому для проверки того, что additional отсутствует, необходимо сначала пометить этот ключ как обязательное свойство , добавив список required с именами:

schema_data = {
    "type" : "object",
    "properties" : {
        "price" : {"type" : "number"},
        "name" : {"type" : "string"},
        "additional" : {"type" : "number"},
        },
    "required": ["price", "name", "additional"]
}

Сейчаспроверка не выполнит ваши данные JSON, потому что отсутствует additional:

>>> validate(json_data, schema_data)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/.../site-packages/jsonschema/validators.py", line 541, in validate
    cls(schema, *args, **kwargs).validate(instance)
  File "/.../site-packages/jsonschema/validators.py", line 130, in validate
    raise error
jsonschema.exceptions.ValidationError: 'additional' is a required property

Failed validating 'required' in schema:
    {'properties': {'additional': {'type': 'number'},
                    'name': {'type': 'string'},
                    'price': {'type': 'number'}},
     'required': ['price', 'name', 'additional'],
     'type': 'object'}

On instance:
    {'name': 'Eggs', 'new': 90, 'price': 34.99}

Чтобы сделать добавление больше ключей недопустимым, вам нужно установить additionalProperties в false;по умолчанию разрешены дополнительные свойства:

schema_data = {
    "type" : "object",
    "properties" : {
        "price" : {"type" : "number"},
        "name" : {"type" : "string"},
        "additional" : {"type" : "number"},
        },
    "required": ["price", "name", "additional"],
    "additionalProperties": False
}

Однако, если additional по-прежнему отсутствует, добавление ключа new при использовании validate() не найдено, поскольку обнаружена первая ошибкавызывается как исключение.

Чтобы получить все ошибки проверки схемы, создайте объект проверки для схемы, а затем используйте метод IValidator.iter_errors() , чтобы просмотреть все найденные ошибки.:

from json_schema.validators import validator_for

validator = validator_for(schema_data)(schema_data)  # get class, create instance
for error in validator.iter_errors(json_data):
    print(error)

и теперь вы получаете информацию о каждой ошибке:

'additional' is a required property

Failed validating 'required' in schema:
    {'additionalProperties': False,
     'properties': {'additional': {'type': 'number'},
                    'name': {'type': 'string'},
                    'price': {'type': 'number'}},
     'required': ['price', 'name', 'additional'],
     'type': 'object'}

On instance:
    {'name': 'Eggs', 'new': 90, 'price': 34.99}
Additional properties are not allowed ('new' was unexpected)

Failed validating 'additionalProperties' in schema:
    {'additionalProperties': False,
     'properties': {'additional': {'type': 'number'},
                    'name': {'type': 'string'},
                    'price': {'type': 'number'}},
     'required': ['price', 'name', 'additional'],
     'type': 'object'}

On instance:
    {'name': 'Eggs', 'new': 90, 'price': 34.99}

Каждый error объект в цикле является ValidatorError объектом исключения ,который имеет ряд атрибутов, может помочь вам точно определить, в чем проблема, в коде.

...