JSON как формат обмена данными

JSON как формат обмена данными

API отдаёт данные. Но в каком виде? Ответ: почти всегда в JSON. Разберём, что это за формат, какой у него синтаксис и почему он вытеснил XML как стандарт обмена данными в вебе.

Что такое JSON

JSON (JavaScript Object Notation) — текстовый формат обмена данными. Основан на синтаксисе объектов JavaScript, но НЕ зависит от JavaScript — его читает и генерирует любой язык программирования. JSON описывает данные в виде пар ключ-значение и упорядоченных списков:

{
  "name": "Иван",
  "age": 30,
  "isStudent": false,
  "hobbies": ["программирование", "фотография"],
  "address": {
    "city": "Москва",
    "street": "Тверская"
  }
}

Текстовый — значит, человек может прочитать глазами. Это огромный плюс для отладки и обучения. Бинарные форматы (Protobuf, MessagePack) компактнее и быстрее, но ты не откроешь их в блокноте.

JSON vs XML: история победы

До JSON стандартом обмена данными был XML (eXtensible Markup Language). Те же данные в XML:

<user>
  <name>Иван</name>
  <age>30</age>
  <hobbies>
    <hobby>программирование</hobby>
    <hobby>фотография</hobby>
  </hobbies>
</user>
</user>

JSON победил по трём причинам:

  1. Меньше синтаксического шума. JSON-пример выше — 140 символов, XML — 250. Разница в 1.8 раза на ровном месте.
  2. Прямое отображение на структуры данных языков программирования. JSON-объект → объект/словарь, JSON-массив → массив/список. В XML для любого списка нужна обёртка (<hobbies> вокруг <hobby>).
  3. Нативный для веба. JavaScript (язык браузеров) понимает JSON без парсеров.

XML всё ещё используется в enterprise (SOAP-сервисы, электронный документооборот), но для Web API JSON стал стандартом де-факто.

Синтаксис JSON: полный разбор

JSON имеет всего 6 типов значений:

ТипПримерПримечание
Строка"hello"Двойные кавычки ("), не одинарные (')
Число42, 3.14, -10Целые и дробные, без кавычек
Булевоtrue, falseБез кавычек
nullnullОтсутствие значения
Массив[1, 2, 3]Упорядоченный список любых значений
Объект{"key": "value"}Пары ключ-значение, ключи — всегда строки

Объекты и массивы можно бесконечно вкладывать:

{
  "products": [
    {
      "id": 1,
      "title": "Футболка",
      "variants": [
        {"size": "M", "price": 1200},
        {"size": "L", "price": 1400}
      ]
    }
  ]
}

Частые ошибки в JSON

Новички ломают JSON одинаковым образом. Запомни эти правила:

  • Последний элемент без запятой. [1, 2, 3,] — ошибка. {"a": 1, "b": 2,} — ошибка. Запятая только МЕЖДУ элементами.
  • Ключи — только в двойных кавычках. {name: "Иван"} — ошибка. Правильно: {"name": "Иван"}.
  • Строки — только в двойных кавычках. {'city': 'Moscow'} — ошибка. Правильно: {"city": "Moscow"}.
  • Нет комментариев. {"name": "Иван" // пользователь} — ошибка. В JSON нет комментариев.

Если JSON невалиден, JSON.parse() бросит исключение. Проверить JSON можно в любом онлайн-валидаторе или прямо в консоли браузера:

JSON.parse('{"name": "Иван"}');  // OK
JSON.parse('{name: "Иван"}');    // SyntaxError

JSON и JavaScript: парсинг и сериализация

В JavaScript работа с JSON встроена:

// Из JSON-строки в объект (парсинг)
const data = JSON.parse('{"name": "Иван", "age": 30}');
console.log(data.name);  // "Иван"

// Из объекта в JSON-строку (сериализация)
const json = JSON.stringify({ name: "Иван", age: 30 });
console.log(json);  // '{"name":"Иван","age":30}'

JSON.stringify умеет форматировать с отступами для читаемости:

JSON.stringify({ name: "Иван", age: 30 }, null, 2);
// {
//   "name": "Иван",
//   "age": 30
// }

JSON в HTTP

В REST API JSON передаётся в теле HTTP-сообщений с заголовком Content-Type: application/json:

HTTP-запрос:
POST /api/users HTTP/1.1
Content-Type: application/json

{"name": "Иван", "email": "ivan@example.com"}

HTTP-ответ:
HTTP/1.1 201 Created
Content-Type: application/json

{"id": 42, "name": "Иван", "email": "ivan@example.com"}

Заголовок Content-Type: application/json критически важен: без него сервер не поймёт, в каком формате тело, и может вернуть ошибку 415 Unsupported Media Type.

Ограничения JSON

JSON — не идеальный формат. Основные ограничения:

  • Нет дат. Дата 2026-04-30T12:00:00Z — это просто строка. Стороны должны договориться о формате (обычно ISO 8601).
  • Нет бинарных данных. Изображения, файлы передают отдельно (multipart/form-data) или кодируют в base64 внутри JSON.
  • Нет схемы. JSON не говорит, какие поля обязательны. Для этого используют JSON Schema — отдельный язык описания структуры.
  • Глубокая вложенность неудобна. Обращаться к obj.users[0].orders[5].items[2] тяжело читать.

Проверь себя

  1. Какие шесть типов данных есть в JSON?
  2. Почему {'city': 'Moscow'} — невалидный JSON?
  3. Какой HTTP-заголовок указывает, что тело запроса — JSON?
<details> <summary>Ответы</summary>
  1. Строка, число, булево (true/false), null, массив, объект.
  2. Одинарные кавычки не разрешены в JSON. Ключи и строки должны быть в двойных кавычках: {"city": "Moscow"}.
  3. Content-Type: application/json. Без него сервер может не распознать формат тела.
</details>

Что унести с урока

  • JSON — текстовый формат обмена данными: объекты, массивы, 6 простых типов.
  • Строгий синтаксис: двойные кавычки, нет запятых после последнего элемента, нет комментариев.
  • JSON.parse() парсит строку в объект, JSON.stringify() — объект в строку.
  • Content-Type: application/json обязателен при передаче JSON в HTTP-запросах и ответах.

В следующем уроке разберём CRUD через HTTP — как четыре операции (создать, прочитать, обновить, удалить) отображаются на HTTP-методы и URL в RESTful API.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике