> Что делает метод json() у объекта response в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Софт Медиа Групп, Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
Метод json() у объекта Response в JavaScript - это асинхронный метод, который читает тело ответа как поток (stream) и парсит его в JavaScript-объект или массив, используя JSON.parse. Он возвращает Promise, который резолвится с распарсенными данными. Этот метод можно вызвать только один раз, так как тело ответа потребляется однократно.
Подробное объяснение
Метод json() является частью Fetch API и доступен на экземпляре Response, который возвращается fetch(). Он работает следующим образом: сначала читает весь поток данных тела ответа (ReadableStream), затем декодирует его из UTF-8 в строку, после чего применяет JSON.parse() к этой строке. Результат оборачивается в Promise, так как чтение потока - асинхронная операция.
Важно понимать, что json() потребляет тело ответа. После вызова этого метода свойство bodyUsed у объекта Response становится true. Повторный вызов json() или любого другого метода чтения тела (text(), blob(), arrayBuffer(), formData()) приведёт к ошибке TypeError: Already read. Это связано с тем, что поток данных можно прочитать только один раз.
Метод выбрасывает исключение, если ответ не содержит валидный JSON, например, если сервер вернул HTML или текст. В таком случае Promise переходит в состояние rejected с ошибкой SyntaxError. Поэтому вызов json() всегда должен быть обёрнут в try/catch или обрабатываться через .catch().
На практике
При работе с json() важно проверять статус ответа перед парсингом. Если сервер вернул ошибку (например, 404 или 500), тело ответа может содержать не JSON, а HTML-страницу с описанием ошибки. В таких случаях вызов json() упадёт с ошибкой парсинга, а не с HTTP-ошибкой. Рекомендуется сначала проверить response.ok или response.status, и только при успешном статусе вызывать json().
Также стоит учитывать, что json() не клонирует ответ. Если нужно прочитать тело несколько раз (например, для логирования и последующей обработки), следует использовать response.clone() перед первым чтением. Это создаёт копию объекта Response с тем же телом.
Пример кода
JAVASCRIPT// Правильный подход с проверкой статусаasync function fetchData(url) {try {const response = await fetch(url);if (!response.ok) {throw new Error(`HTTP error! status: ${response.status}`);}const data = await response.json();return data;} catch (error) {console.error('Fetch failed:', error);throw error;}}// Обработка ошибки парсингаasync function safeJsonFetch(url) {const response = await fetch(url);const text = await response.text(); // сначала читаем как текстtry {return JSON.parse(text); // парсим вручную} catch {throw new Error('Invalid JSON response');}}
Как отвечать на собеседовании
Начни с краткого определения: метод json() асинхронно парсит тело ответа в JavaScript-объект. Затем объясни, что он возвращает Promise и потребляет тело однократно. Упомяни, что под капотом происходит чтение потока и JSON.parse. Покажи понимание edge cases: проверка статуса ответа, обработка ошибок парсинга, невозможность повторного вызова. Если спросят про альтернативы, скажи, что можно использовать text() + JSON.parse() для более тонкого контроля. Для senior-уровня добавь про response.clone() и работу с потоками.
Что проверяет интервьюер
Интервьюер проверяет понимание асинхронности в JavaScript, знание Fetch API и его особенностей, умение обрабатывать ошибки в асинхронном коде, понимание работы с потоками данных (streams) и ограничения однократного чтения тела ответа. Также оценивается способность предусмотреть типичные проблемы на production и предложить правильные паттерны обработки.
Типичные ошибки
- Вызов
json()без проверкиresponse.ok- при HTTP-ошибке парсинг упадёт с неинформативной ошибкой - Попытка вызвать
json()дважды - получитеTypeError: Already read - Игнорирование того, что
json()может выброситьSyntaxErrorпри невалидном JSON - Отсутствие обработки rejected Promise через try/catch или .catch()
- Предположение, что
json()синхронный - это асинхронный метод, возвращающий Promise
> Похожие задачи по frontend
Как запустить код в консоли браузера
Что еще можно сделать с помощью замыканий в JavaScript кроме счетчика
Как реализовать показ попапа через 3 секунды после захода на сайт с возможностью закрытия и запоминанием закрытия между сессиями?
Почему страница зависает при обработке большого массива в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью