/
Вопросы и ответы
/
JavaScript
/

Почему при fetch локального JSON в React возникает ошибка “Unexpected token '<'”?

Почему при fetch локального JSON в React возникает ошибка “Unexpected token '<'”?

При попытке загрузить локальный JSON-файл с помощью fetch в React появляется ошибка:

1
Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON

Файлы расположены так же, как в примере на Hexlet. Как правильно вызвать fetch для локального JSON?

год назад

Nikolai Gagarinov

Ответы

1

Ошибка возникает потому, что браузер не может напрямую читать файлы с файловой системы через fetch. Вместо JSON-файла возвращается HTML (например, страница 404 или index.html), поэтому парсер JSON видит < вместо {.

Как исправить

  1. Положите JSON-файл в папку public вашего React-приложения. Например:
1
my-app/public/data.json
  1. Используйте fetch относительно корня public:
1
2
3
4
fetch('/data.json')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error));

В этом случае файл будет доступен по URL, и fetch сможет корректно прочитать JSON.

Альтернативно можно настроить Webpack/DevServer, чтобы он отдавал локальные файлы, но проще использовать public для статических ресурсов.

Ну и посмотрите пример настроенного приложения

год назад

Nikolai Gagarinov

0

Ошибка Unexpected token '<', "<!DOCTYPE "... is not valid JSON значит, что fetch получил HTML-страницу вместо JSON. Сервер разработки не нашёл файл по указанному адресу и отдал index.html, а response.json() попытался разобрать его как JSON.

Решение 1: положить файл в public

Файлы из папки public сервер отдаёт по адресу от корня сайта:

1
2
3
4
5
public/
  data/
    users.json
src/
  App.jsx
1
2
3
4
5
useEffect(() => {
  fetch('/data/users.json')
    .then((response) => response.json())
    .then((data) => setUsers(data));
}, []);

Путь пишется от корня — /data/users.json, без public и без ../. Файлы из src через fetch недоступны: сборщик не публикует их как отдельные адреса.

Решение 2: импортировать JSON

Если данные не меняются, fetch не нужен. Vite и Create React App умеют импортировать JSON как модуль:

1
2
3
import users from './data/users.json';

console.log(users[0]);

Файл попадёт прямо в сборку.

Как найти причину

Откройте вкладку Network в DevTools и посмотрите на запрос к JSON:

  • в ответе HTML — неверный путь, файл не найден;
  • статус 404 — файла нет по этому адресу;
  • ответ JSON, но ошибка остаётся — в файле синтаксическая ошибка, проверьте его валидатором.

Перед разбором полезно проверить статус ответа:

1
2
3
4
5
6
7
fetch('/data/users.json')
  .then((response) => {
    if (!response.ok) {
      throw new Error(`Файл не найден: ${response.status}`);
    }
    return response.json();
  });

Открыть HTML-файл двойным кликом, через file://, тоже не получится: браузер запрещает fetch к локальным файлам. Запускайте проект через сервер разработки — npm run dev или npm start.

React и работу с API разбирают в профессии «Фронтенд-разработчик».

7 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845