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 победил по трём причинам:
- Меньше синтаксического шума. JSON-пример выше — 140 символов, XML — 250. Разница в 1.8 раза на ровном месте.
- Прямое отображение на структуры данных языков программирования. JSON-объект → объект/словарь, JSON-массив → массив/список. В XML для любого списка нужна обёртка (
<hobbies>вокруг<hobby>). - Нативный для веба. JavaScript (язык браузеров) понимает JSON без парсеров.
XML всё ещё используется в enterprise (SOAP-сервисы, электронный документооборот), но для Web API JSON стал стандартом де-факто.
Синтаксис JSON: полный разбор
JSON имеет всего 6 типов значений:
| Тип | Пример | Примечание |
|---|---|---|
| Строка | "hello" | Двойные кавычки ("), не одинарные (') |
| Число | 42, 3.14, -10 | Целые и дробные, без кавычек |
| Булево | true, false | Без кавычек |
| null | null | Отсутствие значения |
| Массив | [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]тяжело читать.
Проверь себя
- Какие шесть типов данных есть в JSON?
- Почему
{'city': 'Moscow'}— невалидный JSON? - Какой HTTP-заголовок указывает, что тело запроса — JSON?
- Строка, число, булево (true/false), null, массив, объект.
- Одинарные кавычки не разрешены в JSON. Ключи и строки должны быть в двойных кавычках:
{"city": "Moscow"}. Content-Type: application/json. Без него сервер может не распознать формат тела.
Что унести с урока
- JSON — текстовый формат обмена данными: объекты, массивы, 6 простых типов.
- Строгий синтаксис: двойные кавычки, нет запятых после последнего элемента, нет комментариев.
JSON.parse()парсит строку в объект,JSON.stringify()— объект в строку.Content-Type: application/jsonобязателен при передаче JSON в HTTP-запросах и ответах.
В следующем уроке разберём CRUD через HTTP — как четыре операции (создать, прочитать, обновить, удалить) отображаются на HTTP-методы и URL в RESTful API.