# jsonschema

Используется для валидации json схемы. По умолчанию дополнительно указанные ключи (не существующие в схеме, но присутствующие в документе) не проверяются.

**Установка**

```bash
pip install jsonschema
```

**Базовое использование**

```python
from jsonschema import validate

validate(instance=json_to_check, schema=schema)
```

**Исключения**

jsonschema.exceptions.ValidationError - если документ не соответствует структуре

jsonschema.exceptions.SchemaError - если сама схема некорректна

**Пример схемы:**

```json
schema = {
    "type": "object",
    "properties": {
        "name": {"type": "string"},
        "age": {"type": "number"},
    },
    "required": ["name"],
}
```

Данная схема определяет json объект с 2 свойствами: name и age. Обязательное свойство name.

**Ключевые слова**

Для некоторых типов используются дополнительные ключевые слова.

<table border="1" id="bkmrk-%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D0%BE%D0%B5-%D1%81%D0%BB%D0%BE%D0%B2%D0%BE-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0" style="border-collapse: collapse; width: 100%;"><colgroup><col style="width: 16.9211%;"></col><col style="width: 83.0789%;"></col></colgroup><thead><tr><td class="align-center">Ключевое слово</td><td class="align-center">Описание</td></tr></thead><tbody><tr><td>type</td><td>Тип. Для корня часто object.

string - строка

number - число

object - объект

array - список

</td></tr><tr><td>$defs</td><td>Вложенный шаблон для случая, когда шаблон элемента встречается в нескольких местах.</td></tr><tr><td>$ref</td><td>Подстановка вложенного шаблона.</td></tr><tr><td>$schema</td><td>Ссылка на шаблон шаблона. При обновлении версии библиотеки будет использоваться новый шаблон шаблона, что может привести к проблемам. Желательно указывать.</td></tr></tbody></table>

**Дополнительные ключевые слова для типов.**

 **Тип array**

<table border="1" id="bkmrk-%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D0%BE%D0%B5-%D1%81%D0%BB%D0%BE%D0%B2%D0%BE-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0-1" style="border-collapse: collapse; width: 100%; height: 89.3907px;"><colgroup><col style="width: 17.4405%;"></col><col style="width: 82.6786%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Ключевое слово</td><td class="align-center" style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">items</td><td style="height: 29.7969px;">Тип элементов списка.

```json
"scores": {
            "type": "array",
            "items": {"type": "number"},
        }
```

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">minItems</td><td style="height: 29.7969px;">Минимальное количество элементов</td></tr><tr><td>  
</td><td>  
</td></tr></tbody></table>

**Тип object**

<table border="1" id="bkmrk-%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D0%BE%D0%B5-%D1%81%D0%BB%D0%BE%D0%B2%D0%BE-%D0%9E%D0%BF%D0%B8%D1%81%D0%B0-2" style="border-collapse: collapse; width: 100%; height: 89.3907px;"><colgroup><col style="width: 17.2025%;"></col><col style="width: 82.9167%;"></col></colgroup><thead><tr style="height: 29.7969px;"><td class="align-center" style="height: 29.7969px;">Ключевое слово</td><td class="align-center" style="height: 29.7969px;">Описание</td></tr></thead><tbody><tr style="height: 29.7969px;"><td style="height: 29.7969px;">required</td><td style="height: 29.7969px;">Список обязательных ключей.

```json
"required": ["name"]
```

</td></tr><tr style="height: 29.7969px;"><td style="height: 29.7969px;">properties</td><td style="height: 29.7969px;">Определяет ключи объекта и их тип.

```json
"properties": {
        "name": {"type": "string"}
    },
```

</td></tr><tr><td>additionalProperties</td><td>Если True, то дополнительно указанные ключи приводят к исключению.

</td></tr></tbody></table>

**Локальные вложенные шаблоны.**

Для определения используется переменная $defs, для использования - $ref.

```json
schema = {
    "type": "object",
    "properties": {
        "address": {"$ref": "#/$defs/address"},
    },
    "$defs": {
        "address": {
            "type": "object",
            "properties": {
                "street": {"type": "string"},
            }
        },
    },
}
```