> Что делает метод 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

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью