> For the complete documentation index, see [llms.txt](https://daymonri.gitbook.io/techwritersummary/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://daymonri.gitbook.io/techwritersummary/languages-formats/json.md).

# JSON

**JSON** (JavaScript Object Notation) – формат для хранения и передачи структурированных данных, основан на синтаксисе объектов JavaScript (но не привязан к нему).

**Синтаксис JSON** повторяет синтаксис объекта в **JavaScript**: данные записываются в виде пар «ключ : значение» и разделяются запятыми. Важно помнить, что после последней пары запятая не ставится.

**Ключи** – строковые переменные, а значения могут быть строками, числами, булевыми параметрами, объектами, массивами или null.

**JSON-файл** может быть сохранён как текстовый файл с расширением .json. Пример содержимого такого файла:

```json
{
  "name": "John Smith",
  "age": 37
}
```

**Даты в JSON** переводятся в строковый формат ISO 8601: 2023-08-24T20:45:03.408Z.

Для хранения данных в JSON используются две структуры – **объекты и массивы**.

* **Объект** – неупорядоченная коллекция. Для неё непринципиально, в каком порядке следуют пары «ключ : значение». Пример объекта – выше.
* **Массив** – упорядоченный список значений. Пример:

```json
[
    "яблоко",
    "персик",
    "банан",
    "киви"
]
```

В отличие от объекта, в массиве важен порядок элементов. Тут нет ключей, поэтому обращаться к значениям мы можем только по индексу элемента. Важно помнить, что у первого элемента индекс 0.

Объекты и массивы могут быть вложены друг в друга, количество уровней вложенности не ограничено.

```json
{
// Это комментарий
}
```

**JSON5** – расширение JSON, повышающее читаемость и удобство записи данных. Особенности JSON5:

* допустимы комментарии;
* необязательно использовать кавычки для ключей;
* есть специальный формат для дат и времени;
* поддерживает многострочный текст;
* допускает запись чисел с подчёркиваниями для улучшения читаемости;
* поддерживает шестнадцатеричную и восьмеричную систему счисления.

**JSON Schema** позволяет добавить в файл метаданные, например – какие поля обязательные и какие типы данных они могут содержать. JSON Schema используется для валидации данных при обмене информацией. Пример «схемы»:

```json
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "age": {
      "type": "number"
    },
    "address": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string"
        },
        "zip": {
          "type": "string"
        }
      },
      "required": ["city", "zip"]
    }
  },
  "required": ["name", "age", "address"]
}
```

*Здесь в первой строке указана ссылка на версию спецификации JSON Schema. Далее «схема» говорит, что данные должны быть объектом типа «object»; объект должен содержать три обязательных поля: «name», «age» и «address»; у каждого поля свой тип данных: «string» для имени, «number» для возраста и «object» для адреса; поле «address» должно быть объектом и содержать два обязательных подполя: «city» и «zip», которые относятся к строкам.*

**Сериализация** – преобразование данных из внутреннего формата, например из JavaScript-объекта, в формат JSON, который может быть отправлен на сервер. В большинстве языков программирования для этого есть встроенные функции/библиотеки. Например, в JavaScript преобразование объекта person в JSON-файл выглядит так:

```json
const person = {
  name: 'John Doe',
  age: 30,
  address: {
    city: 'New York',
    zip: '10001'
  }
};

const jsonString = JSON.stringify(person); // Метод JSON.stringify преобразует объект person в JSON-формат

console.log(jsonString); // Выводит данные в консоль
```

**Десериализация**, наоборот, преобразует данные из формата JSON обратно во внутренний формат, с которым программист может работать в своём коде:

```json
const jsonString = '{"name":"John Doe","age":30,"address":{"city":"New York","zip":"10001"}}';

const person = JSON.parse(jsonString); // Преобразуем JSON в объект person

console.log(person); // Выводит данные в консоль
```

**JSON Validator** <https://jsonlint.com/>

Пример получения доступа к данным в JSON-файле, который содержит объекты и массивы:

```json
superHeroes["members"][1]["powers"][2];
```

*Даём имя переменной – superHeroes. Внутри неё хотим получить доступ к свойству members, поэтому пишем \['members']. members содержит массив с объектами. Мы хотим получить доступ ко второму объекту внутри этого массива, поэтому пишем \[1]. Внутри этого объекта мы хотим получить доступ к свойству powers, поэтому пишем \['powers']. В свойстве powers находится массив, содержащий сверхспособности выбранного героя. Нам нужен третий, поэтому пишем \[2].*
