Что такое JSON и как веб-приложения обмениваются данными
Основы3 минРедакция Innovialabs
Коротко
JSON — текстовый формат для передачи структурированных данных: объекты, массивы, строки, числа, true/false и null; через него фронтенд и бэкенд обмениваются данными по HTTP с заголовком Content-Type: application/json.
JSON в двух словах
JSON (JavaScript Object Notation) — текстовый формат для передачи данных. Он похож на объекты JavaScript, но это просто строка, которую умеет читать практически любой язык: Python, PHP, Go, Java, C#.
Когда интернет-магазин показывает список товаров, браузер чаще всего получает его с сервера именно в JSON:
{
"id": 42,
"name": "Рюкзак",
"price": 349000,
"inStock": true,
"tags": ["школа", "спорт"],
"discount": null
}
Синтаксис и типы данных
В JSON всего шесть типов:
| Тип | Пример |
|---|---|
| строка | "Ташкент" |
| число | 42, 3.14, -1e3 |
| логический | true, false |
| null | null |
| массив | [1, 2, 3] |
| объект | {"key": "value"} |
Строгие правила, которые отличают JSON от JavaScript:
- Ключи — только в двойных кавычках:
{"name": "Ali"}, а не{name: 'Ali'}. - Строки — только в двойных кавычках.
- Нет висячих запятых после последнего элемента.
- Нет комментариев.
- Нет
undefined, функций, дат иNaN. Даты передают строкой, обычно в формате ISO 8601:"2026-03-15T10:00:00Z".
Как фронтенд и бэкенд обмениваются JSON
Типичный цикл выглядит так:
- Фронтенд превращает объект в строку:
JSON.stringify(). - Отправляет её в теле HTTP-запроса с заголовком
Content-Type: application/json. - Сервер разбирает строку обратно в объект, обрабатывает и отвечает тоже JSON.
- Фронтенд разбирает ответ:
response.json()илиJSON.parse().
const res = await fetch('/api/orders', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ productId: 42, qty: 2 }),
});
if (!res.ok) {
throw new Error(`HTTP ${res.status}`);
}
const order = await res.json();
На сервере в Express то же самое делает одна строка app.use(express.json()): она читает тело запроса с нужным заголовком и кладёт результат в req.body.
Типичные ошибки парсинга
Unexpected token < in JSON— вместо JSON пришёл HTML. Обычно это страница ошибки 404 или 500, неправильный URL API или редирект на страницу входа. Проверьте вкладку Network в DevTools.Unexpected end of JSON input— пустой ответ, например статус 204, или обрезанное тело. Не вызывайтеres.json(), если тела нет.- Одинарные кавычки или висячая запятая — JSON собран вручную строкой. Всегда используйте
JSON.stringify, а не конкатенацию. - Сервер не видит тело запроса — забыли заголовок
Content-Type: application/jsonили middleware для разбора. - Потеря точности больших чисел — числа больше
Number.MAX_SAFE_INTEGERв JavaScript округляются. Большие идентификаторы безопаснее передавать строками. - Даты приходят строками — это нормально. Преобразуйте их в
Dateтам, где они нужны.
Хорошая привычка — проверять res.ok и Content-Type ответа перед разбором, а входящие данные на сервере валидировать схемой.
JSON, XML и form data
| JSON | XML | form data | |
|---|---|---|---|
| Где встречается | REST API, конфиги, мобильные приложения | старые корпоративные системы, SOAP, банковские и государственные интеграции | HTML-формы, загрузка файлов |
| Читаемость | высокая | ниже, много тегов | пары ключ-значение |
| Вложенные структуры | естественно | да | неудобно |
| Файлы | только через base64 | только через base64 | нативно через multipart |
| Разбор в браузере | JSON.parse | DOMParser | FormData |
Как выбрать:
- Обычный API — JSON.
- Загрузка файлов —
multipart/form-data, а метаданные можно положить в соседнее поле. - Интеграция со старой системой, которая говорит только на XML, — XML, тут выбора нет.