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

Как импортировать json в js

Как импортировать json в js

5 лет назад

Человек-Молекула

Ответы

7

К приятным особенностям json-формата относится то, что его можно импортировать в нужном нам модуле напрямую, не используя методы для чтения файлов, такие как fs.readFileSync(). Дело в том, что метод fs.readFileSync() и другие относятся к среде node.js и не будут работать в браузере, а попытка их импорта, например, внутри React-приложения:

1
import { readFileSync } from 'node:fs';

приведет к падениям и ошибкам.

Предположим, у нас есть следующие данные в формате json:

1
2
3
4
5
6
7
8
9
{"widget": {
  "debug": "on",
  "window": {
    "title": "Sample Konfabulator Widget",
    "name": "main_window",
    "width": 500,
    "height": 500
  }
}}

Сохраним эти данные внутри нашего приложения по адресу data/example.json. А потом просто импортируем их там, где они нам нужны, не забыв указать правильный путь:

1
import exampleJsonFile from './data/example.json'; // имя при импорте может не совпадать с именем файла

Еще одна важная особенность заключается в том, что при таком способе данные парсятся автоматически, и нет необходимости использовать JSON.parse():

1
2
3
4
5
// вывод смотрим в инструментах разработчика (F12)

console.log(typeof exampleJsonFile); // => object
console.log(exampleJsonFile.widget) // => {debug: 'on', window: {…}}
console.log(exampleJsonFile.widget.window.title); // => Sample Konfabulator Widget

4 года назад

Кирилл Маркеев

2

Для того чтобы "распарсить" json-данные, и превратить их в js-объект, достаточно использовать метод JSON.parse().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Читаем json-файл, результатом в data будет строка
const readFile = fs.readFileSync('jsonex.json', 'utf8');
console.log(readFile);
/* Результат:
{ 
  "id": "1",
  "firstName": "Tom",
  "lastName": "Cruise"
}
*/
const parsedData = JSON.parse(readFile);
// После парсинга переменной мы получаем объект, к свойствам которого можно обращаться как обычно — например, через "." 
console.log(parsedData.firstName);
// Результат: Tom

4 года назад

Вячеслав Межуревский

0

Способ зависит от того, где работает код.

ГдеКак
Node.js, ES-модулиimport data from './data.json' with { type: 'json' };
Node.js, CommonJSconst data = require('./data.json');
Браузерfetch('/data.json').then((r) => r.json())
Vite, webpackimport data from './data.json';

ES-модули: import with type json

1
2
3
import data from './data.json' with { type: 'json' };

console.log(data.name);

Без with { type: 'json' } браузер и Node.js выдадут ошибку. Синтаксис работает в Node.js 22 и новее и в актуальных версиях Chrome, Edge, Safari и Firefox.

JSON-модуль даёт только экспорт по умолчанию. Именованный импорт import { name } from './data.json' не сработает.

Динамический импорт:

1
const { default: data } = await import('./data.json', { with: { type: 'json' } });

CommonJS: require

1
const data = require('./data.json');

Node.js читает и разбирает файл сам. Файл кэшируется: если он изменится во время работы программы, повторный require вернёт старые данные.

Чтение файла через fs

Если файл нужно перечитывать или путь известен только во время работы:

1
2
3
4
import { readFile } from 'node:fs/promises';

const text = await readFile('./data.json', 'utf-8');
const data = JSON.parse(text);

Путь в readFile считается от папки, из которой запустили программу. Где лежит файл с кодом, значения не имеет.

Браузер без сборщика

1
2
3
const response = await fetch('/data.json');
const data = await response.json();
console.log(data);

Страница должна открываться через сервер. Если открыть HTML двойным кликом (адрес начинается с file://), браузер заблокирует запрос. Для проверки хватит npx serve в папке проекта.

Vite и webpack

Сборщики импортируют JSON без дополнительных настроек:

1
2
import data from './data.json';
import { version } from './package.json';

В Vite работает и именованный импорт отдельных полей.

TypeScript

Включите в tsconfig.json:

1
2
3
4
5
6
{
  "compilerOptions": {
    "resolveJsonModule": true,
    "esModuleInterop": true
  }
}

После этого TypeScript знает типы полей из файла.

Ошибка Unexpected token в JSON

JSON.parse и импорт падают, если в файле есть комментарии, одинарные кавычки или запятая после последнего элемента. В JSON допустимы только двойные кавычки и нет комментариев.

Модули, import и работу с данными разбирают в бесплатном курсе «Основы JavaScript».

3 дня назад

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

+7 800 100 22 47

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

+7 495 085 21 62

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

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