# JSON + JSON Schema

{% hint style="info" %}
JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript.
{% endhint %}

## Ограничения и синтаксис JSON

Допустимые форматы данных для пары "key":"value" в JSON указаны в карточках ниже:

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td><strong>Ключ "key"</strong></td><td>string</td><td></td></tr><tr><td><strong>Значение "value"</strong></td><td>string<br>number (integer)<br>object<br>array<br>boolean<br>null</td><td></td></tr></tbody></table>

Основные правила синтаксиса:

1. Данные записываются в виде пар {“ключ”: значение}.
2. Данные разделяются запятыми.
3. В фигурных скобках записываются объекты.
4. В квадратных скобках записываются массивы.
5. Наименования «ключей» регистрозависимы.

<details>

<summary>Пример JSON</summary>

```json
{
    "students": [
        {
            "id": 101,
            "name": "Max",
            "score": {
                "Math": 90,
                "Science": 80,
                "Compute": 70
            }
        },
        {
            "id": 102,
            "name": "Sam",
            "score": {
                "Math": 76,
                "Science": 80,
                "Compute": 66
            }
        }
        ],
    "name_school": "EKB Lyceum",
    "name_teacher": "TO"
}
```

</details>

## JSON Schema

{% hint style="info" %}
JSON Schema – это своеобразный язык описания структуры JSON-документации. Базируется на разных концепциях. Выступает в качестве самоописательного языка.
{% endhint %}

Схема создана для описания JSON-данных, но и сама она при этом является JSON-объектом. С помощью ключевых слов (keywords) в схеме создаются правила валидации структуры объекта и типов его полей.

<details>

<summary>Простой пример JSON</summary>

```json
{
  "id": 210700286,
  "first_name": "Lindsey",
  "last_name": "Stirling"
}
```

</details>

<details>

<summary>Пример простой JSON Schema</summary>

```json
{
      "type": "object",
      "properties": {
        "id": {
          "type": "integer",
          "description": "User ID"
        },
        "first_name": {
          "type": "string",
          "description": "User first name"
        },
        "last_name": {
          "type": "string",
          "description": "User last name"
        }
      },
      "required": [
        "id",
        "first_name",
        "last_name"
      ]
}
```

</details>

## "Keywords" для описания схемы

<table data-full-width="true"><thead><tr><th width="176">Keywords</th><th width="183">Описание</th><th>Пример</th></tr></thead><tbody><tr><td><code>"$schema"</code></td><td>Используется для задания версии драфта схемы</td><td><p></p><pre><code>"$schema": http://json-schema.org/draft-04/schema#
</code></pre></td></tr><tr><td><code>"$id"</code></td><td>Используется для указания уникального идентификатора документа или его подсхем.</td><td><p></p><pre><code>"$id": "http://archi-blair.com/schemas/RolesDictionaryDef.json#"
</code></pre></td></tr><tr><td><code>"title" "description" "examples" "comment"</code></td><td>Комментарии к JSON схеме</td><td></td></tr></tbody></table>

## "Keywords" зависимые от типа данных

### `Тип данных: "type": "string"`

<table data-full-width="true"><thead><tr><th width="136">Keywords</th><th width="240">Описание</th><th width="342">Пример JSON Shema</th><th>Примеры JSON сообщения</th></tr></thead><tbody><tr><td>minLength<br>maxLength</td><td>Длину строки string можно ограничить с помощью ключевых слов <strong>minLength</strong> и <strong>maxLength</strong>. Для обоих ключевых слов значение должно быть неотрицательным числом.</td><td><pre><code>{
  "type": "string",
  "minLength": 2,
  "maxLength": 3
}
</code></pre></td><td><pre><code>// Положительный кейс 
{ "АB" } или { "АBС" }

// Отрицательный кейс
{ "АBCD" } </code></pre></td></tr><tr><td>pattern</td><td>Формат строки string можно ограничивать с помощью ключевого слова pattern. Паттерн задается с помощью регулярного выражения RegEx</td><td><pre><code>{
"type": "string",
"pattern": "^(\\(\[0-9]{3}\\))?\[0-9]{3}-\[0-9]{4}$"
} </code></pre></td><td><pre><code>// Положительный кейс
{ "555-1212" }

// Отрицательный кейс
{ "(800)FLOWERS" } </code></pre></td></tr></tbody></table>

### `Тип данных: "type": "number"`

<table data-full-width="true"><thead><tr><th width="192">Keywords</th><th width="240">Описание</th><th>Пример JSON Shema</th><th>Примеры JSON сообщения</th></tr></thead><tbody><tr><td>minimum<br>maximum<br>exclusiveMinimum<br>exclusiveMaximum </td><td><p>Диапазон числа number можно ограничивать с помощью ключевых слов.</p><p>Если x - это проверяемое значение, то должно выполняться следующее:</p><ul><li>x ≥ minimum</li><li>x > exclusiveMinimum</li><li>x ≤ maximum</li><li>x &#x3C; exclusiveMaximum</li></ul></td><td><pre><code>{
  "type": "number",
  "minimum": 0,
  "exclusiveMaximum": 100
}
</code></pre></td><td><pre><code>// Положительный кейс 
{ 0 } или { 99 } или { 10 }

// Отрицательный кейс
{ 100 } или { -1 } </code></pre></td></tr><tr><td>multipleOf</td><td>Кратность числа number можно ограничивать с помощью multipleOf</td><td><pre><code>{
"type": "number",
"multipleOf" : 10
} </code></pre></td><td><pre><code>// Положительный кейс
{ 10 } или { 20 }

// Отрицательный кейс
{ 23 } </code></pre></td></tr></tbody></table>

### `Тип данных: "type": "object"`

<table data-full-width="true"><thead><tr><th width="130">Keywords</th><th width="204">Описание</th><th width="341">Пример JSON Shema</th><th>Примеры JSON сообщения</th></tr></thead><tbody><tr><td>properties</td><td>Тип данных объектов object можно ограничивать с помощью properties в котором прописаны ограничения для каждого объекта</td><td><pre><code>{
  "type": "object",
  "properties": {
    "number": { "type": "number" },
    "street_name": { "type": "string" },
    "street_type": { "enum": ["Street", "Avenue", "Boulevard"] }
  }
}
</code></pre></td><td><pre><code>// Положительный кейс 
{ "number": 1600, "street_name": "Pennsylvania", "street_type": "Avenue" }

// Отрицательный кейс
{ "number": "1600", "street\_name": "Pennsylvania", "street\_type": "Avenue" } </code></pre></td></tr><tr><td>patternProperties</td><td>Тип данных объектов object можно ограничивать с помощью шаблонов свойств </td><td><pre><code>{
"type": "object",
"patternProperties": {
"^S\_": { "type": "string" },
"^I\_": { "type": "integer" }
}
} </code></pre></td><td><pre><code>// Положительный кейс
{ "S\_25": "This is a string" }
{ "I\_0": 42 }

// Отрицательный кейс
{ "S\_0": 42 } </code></pre></td></tr><tr><td>additionalProperties </td><td>Используется для управления обработкой дополнительных элементов, не входящих ни в properties, ни в patternProperties</td><td><pre><code>{
"type": "object",
"properties": {
"number": { "type": "number" },
"street\_name": { "type": "string" },
"street\_type": { "enum": \["Street", "Avenue", "Boulevard"] }
},
"additionalProperties": false
} </code></pre></td><td><pre><code>// Положительный кейс
{ "number": 1600, "street\_name": "Pennsylvania", "street\_type": "Avenue" }

// Отрицательный кейс
{ "number": 1600, "street\_name": "Pennsylvania", "street\_type": "Avenue", "direction": "NW" } </code></pre></td></tr><tr><td>required</td><td>Ограничение  на  обязательные объекты object</td><td><pre><code> {
"type": "object",
"properties": {
"name": { "type": "string" },
"email": { "type": "string" },
"address": { "type": "string" },
"telephone": { "type": "string" }
},
"required": \["name", "email"]
} </code></pre></td><td><pre><code>// Положительный кейс
{
"name": "William",
"email": "<bill@stratford.co.uk>",
"address": "Henley Street,England",
"telephone": "1234"
}

// Отрицательный кейс
{
"name": "William",
"address": "Henley Street,England"
} </code></pre></td></tr><tr><td>propertyNames</td><td>Формат элементов объекта object можно ограничивать с помощью ключевого слова propertyNames. Паттерн задается с помощью регулярного выражения RegEx</td><td><pre><code>{
"type": "object",
"propertyNames": {
"pattern": "^\[A-Za-z\_]\[A-Za-z0-9\_]\*$"
}
} </code></pre></td><td><pre><code>// Положительный кейс
{ "\_a\_proper\_token\_001": "value" }

// Отрицательный кейс
{ "001 invalid": "value" } </code></pre></td></tr><tr><td>minProperties<br>maxProperties</td><td>Количество свойств объекта можно ограничить с помощью ключевых слов</td><td><pre><code>{
"type": "object",
"minProperties": 2,
"maxProperties": 3
} </code></pre></td><td><pre><code>// Положительный кейс
{ "a": 0, "b": 1 }

// Отрицательный кейс
{ "a": 0 } </code></pre></td></tr></tbody></table>

### `Тип данных: "type": "array"`

<table data-full-width="true"><thead><tr><th width="184">Keywords</th><th width="240">Описание</th><th>Пример JSON Shema</th><th>Примеры JSON сообщения</th></tr></thead><tbody><tr><td>items </td><td>Ограничение на тип элементов массива (для всего массива)</td><td><pre><code>{
  "type": "array",
  "items": {
    "type": "number"
  }
}
</code></pre></td><td><pre><code>// Положительный кейс 
[1, 2, 3, 4, 5]

// Отрицательный кейс
\[1, 2, "3", 4, 5] </code></pre></td></tr><tr><td>prefixItems</td><td>Ограничение на тип элементов массива (для каждого конкретного индекса массива)</td><td><pre><code>{
"type": "array",
"prefixItems": \[
{ "type": "number" },
{ "type": "string" },
{ "enum": \["Street", "Avenue", "Boulevard"] },
{ "enum": \["NW", "NE", "SW", "SE"] }
]
} </code></pre></td><td><pre><code>// Положительный кейс
\[1600, "Pennsylvania", "Avenue", "NW"]

// Отрицательный кейс
\[1600, "Pennsylvania", "Avenue", "MOSCOW"] </code></pre></td></tr><tr><td>contains</td><td>Ограничение на содержание элемента в массиве</td><td><pre><code>{
"type": "array",
"contains": {
"type": "number"
}
} </code></pre></td><td><pre><code>// Положительный кейс
\["life", "universe", "everything", 42]

// Отрицательный кейс
\["life", "universe", "everything", "forty-two"] </code></pre></td></tr><tr><td>minItems<br>maxItems</td><td>Ограничение на длину массива </td><td><pre><code>{
"type": "array",
"minItems": 2,
"maxItems": 3
} </code></pre></td><td><pre><code>// Положительный кейс
\[1, 2]

// Отрицательный кейс
\[1, 2, 3, 4] </code></pre></td></tr></tbody></table>

## Пример&#x20;

<table data-full-width="true"><thead><tr><th width="196">Поле</th><th></th><th>Тип</th><th>Обязательность</th><th>Описание </th></tr></thead><tbody><tr><td>time</td><td></td><td><p>string</p><p>"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}(:[0-9]{2}(\\\\.[0-9]{6})?((-|\\\\+)[0-9]{2}:[0-9]{2})?)?)?$"</p></td><td>Да</td><td>Дата и время сообщения</td></tr><tr><td>eventId</td><td></td><td>string (255)</td><td>Да</td><td>Уникальный идентификатор события</td></tr><tr><td>contactID</td><td></td><td>string (255)</td><td>Да</td><td>Идентификатор контакта</td></tr><tr><td>operationType</td><td></td><td>string (enum)</td><td>Да</td><td>Тип операции<br>CREATE, READ, UPDATE, DELETE</td></tr><tr><td>getFlag</td><td></td><td>string (1)</td><td>Да</td><td>Флаг</td></tr><tr><td>phoneNumber</td><td></td><td><p>string (50)</p><p>pattern: "^([0-9]{10})$"</p></td><td>Да</td><td>Номер телефона клиента</td></tr><tr><td>phoneNumberTimeZone</td><td></td><td>string (255)</td><td>Да</td><td>Таймзона клиента</td></tr><tr><td>scenarioId</td><td></td><td>string (255)</td><td>Да</td><td>Номер сценария</td></tr><tr><td>customAttributeList</td><td></td><td>Array [Object]</td><td>Да</td><td></td></tr><tr><td></td><td>attributeName</td><td>string (255)</td><td>Да</td><td>Идентификатор атрибута<br>cardNum, lockSum, lockCurrency, lockDate</td></tr><tr><td></td><td>attributeValue</td><td>string (255)</td><td>Да</td><td>Значение атрибута</td></tr></tbody></table>

<details>

<summary>Большой развернутый пример</summary>

```json
{    
    "$schema":"http://json-schema.org/draft-06/schema#",
    "$ref":"#/definitions/test",
    "description": "Тестовое описание",
    "type": "object",
    "properties": {
      "time": {
        "type": "string",
        "description": "Дата и время сообщения",
        "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}(T[0-9]{2}:[0-9]{2}(:[0-9]{2}(\\\\.[0-9]{6})?((-|\\\\+)[0-9]{2}:[0-9]{2})?)?)?$"
      },
      "eventId": {
        "type": "string",
        "description": "Уникальный идентификатор события",
        "minLength": 1,
        "maxLength": 255
      },
      "contactID": {
        "type": "string",
        "description": "Идентификатор контакта",
        "minLength": 1,
        "maxLength": 255
      },
      "operationType": {
        "type": "string",
        "description": "Тип операции",
	"enum": ["CREATE", "READ", "UPDATE", "DELETE"]
      },
      "getFlag": {
        "type": "string",
        "description": "Флаг",
	"maxLength": 1
      },
      "phoneNumber": {
        "type": "string",
        "description": "Номер телефона клиента",
        "pattern": "^([0-9]{10})$",
        "minLength": 1,
	"maxLength": 50
      },
      "phoneNumberTimeZone": {
        "type": "string",
        "description": "Таймзона клиента",
        "minLength": 1,
	"maxLength": 255
      },
      "scenarioId": {
        "type": "string",
        "description": "Номер сценария",
        "minLength": 1,
	"maxLength": 255
      },
      "customAttributeList": {
        "type": "array",
	"items": {
		"type": "object",
		"properties": {
			"attributeName": {
				"type": "string",
				"description": "Идентификатор атрибута",
				"minLength": 1,
				"maxLength": 255,
				"enum": ["cardNum", "lockSum", "lockCurrency", "lockDate"]
				},
			"attributeValue": {
				"type": "string",
				"description": "Значение атрибута",
				"minLength": 1,
				"maxLength": 255
				}
			},	
		"additionalProperties": false,
		"required":[
			"attributeName",
			"attributeValue"
			]
               }
      }
    },
"additionalProperties": false,
"required": [
	"time",
	"eventId",
	"contactID",
	"operationType",
	"getFlag",
	"phoneNumber",
	"phoneNumberTimeZone",
	"scenarioId",
	"customAttributeList"
    ]
}
```

</details>

Источники:&#x20;

* <https://infostart.ru/1c/articles/1543922/>
* Подробнее про JSON Shema: <https://infostart.ru/1c/articles/1546672/>
* Конвертер: <https://www.liquid-technologies.com/online-json-to-schema-converter>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.system-analyst-base.ru/hard-skills/integracii/formaty-dannykh/json-+-json-schema.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
