Як імпортувати файл json в ecmascript 6?


162

Як я можу отримати доступ до файлу json в Ecmascript 6? Наступне не працює:

import config from '../config.json'

Це добре працює, якщо я спробую імпортувати файл JavaScript.


4
Це не має нічого спільного з ES6, але з завантажувачем модулів, який ви використовуєте. Синтаксис сам по собі прекрасний.
Фелікс Клінг

2
Найчистіший спосіб зробити це - використовувати webpackі json-loaderз ним.
suprita shankar

11
ES6 підтримує імпорт JSON із таким синтаксисом: імпортувати * як дані з './example.json';
williamli

Відповіді:


84

Просте вирішення:

config.js

export default
{
  // my json here...
}

тоді...

import config from '../config.js'

не дозволяє імпортувати існуючі файли .json, але виконує роботу.


170
Це фактично не відповідає на питання. Наприклад, ви не можете просто перетворити пакунок.json в package.js. Бувають випадки, коли ви хочете по-справжньому імпортувати JSON, а не JS.
курйозданні

23
Зовсім не рішення, ви експортуєте об'єкт javascript, який, як виявляється, має той самий синтаксис, що і JSON.
Ма Херес

Оновлено текст випуску; намагання уникнути подальших семантичних дебатів.
Гілберт

Я додав "postbuild": "node myscript.js"крок у свій пакунок.json-файл, який використовує файл-файл, що робить це для мене. myscript.js ­ const replace = require('replace-in-file'); const options = { files: '_demo/typedocs/navexReact.td.js', from: /{/, to: 'export default {', }; const convertJsonOutputToJsModule = async () => { try { const changes = await replace(options) console.log('Converted json to module in files:', changes.join(', ')); } catch (error) { console.error('Error occurred:', error); } } convertJsonOutputToJsModule()
StJohn3D

1
"перетворити його в JS" не є рішенням про те, як імпортувати файл JSON. Це вже не файл JSON. Це результат №1 Google щодо того, як імпортувати JSON, а головна відповідь - не імпортувати JSON.
Jonny

119

У TypeScript або за допомогою Babel ви можете імпортувати файл json у свій код.

// Babel

import * as data from './example.json';
const word = data.name;
console.log(word); // output 'testing'

Довідка: https://hackernoon.com/import-json-into-typescript-8d465beded79


13
Просто для додавання до цього (імпортування шрифтів json) тепер ви можете просто додати це до свого tsconfig ... {"compilerOptions": {"resolutionJsonModule": true}}
Метт Коді

4
Чи підтримують це будь-які браузери? Я спробував це на поточному FF і отримав помилку Loading failed for the module with source "example.json"; в Chrome я отримую "Не вдалося завантажити сценарій модуля: Сервер відповів типом MIME, що не стосується JavaScript," application / json ". Для сценаріїв модулів на специфікацію HTML застосовується сувора перевірка типу MIME."
Coderer

@Coderer працює на всіх моїх браузерах. Увімкнено підтримку ES6 / ES2015?
williamli

2
Мені просто прийшло в голову, коли ви говорите "в ES6", ви насправді маєте на увазі "в TS" - я думав, що ви говорите про код, виданий , tscале насправді це не відбувається. Я намагаюся запустити модулі ES6 у веб-переглядачі ( <script type="module">), і помилки, які ви бачите вище, - це те, що ви отримаєте, якщо запустити цю importлінію безпосередньо. Будь ласка, виправте мене, якщо я помиляюся, і ви насправді мали на увазі, що можна імпортувати з JSON в фактичний ES6.
Кодерер

3
Коли я сказав: "Чи підтримують це будь-які браузери", я не мав на увазі "після того, як ви перекладете його через Вавилон". У першій статті, яку ви пов’язали, TS перекладає importзаяву у вузол require()(спробуйте!), А друга посилання нічого не говорить про імпорт JSON. Проблема тут не в тому, щоб проаналізувати чи модульну систему, це завантажувач - завантажувач браузера не вирішить імпорт нічого іншого, ніж Javascript. Під кришкою ви завжди повинні використовувати AJAX-виклик (fetch / XHR) та аналізувати результат, навіть якщо ваш інструментарій побудови резюмує це.
Кодерер

67

На жаль, ES6 / ES2015 не підтримує завантаження JSON через синтаксис імпорту модуля. Але ...

Є багато способів зробити це. Залежно від ваших потреб ви можете вивчити, як читати файли в JavaScript (це window.FileReaderможе бути варіант, якщо ви працюєте в браузері), або використовувати інші завантажувачі, як описано в інших питаннях (якщо ви користуєтесь NodeJS).

Найпростіший спосіб IMO - це, мабуть, просто помістити JSON як об'єкт JS в модуль ES6 та експортувати його. Таким чином, ви можете просто імпортувати його там, де вам потрібно.

Також варто зазначити, що ви використовуєте Webpack, імпорт файлів JSON працюватиме за замовчуванням (з тих пір webpack >= v2.0.0).

import config from '../config.json';

5
Не потрібно ставити його в рядку. Це називається JSON, а не JSSN.
кращий олівер

4
Крім того, торазабуро пояснив у раніше видаленій відповіді: Не існує "модульної системи" ES6; є API, який реалізується певним завантажувачем. Будь-який завантажувач може робити все, що завгодно, включаючи підтримку імпорту файлів JSON. Наприклад, завантажувач може вибрати підтримку імпорту foo з './directory як значення для імпорту каталогу /
index.js

5
насправді ES6 / ES2015 підтримують завантаження JSON через синтаксис імпорту: імпортувати * як дані з './example.json';
williamli

+1 для нагадування, що веб-пакет робить це автоматично. Але обережно, якщо у вас "test: /.js/" webpack спробує скомпілювати ваш файл json як JavaScript. #fail. Щоб виправити це, змініть його на "test: /.js$/"
Реп

webpack заснований на nodejs, чи не так?
Айяш

20

Я використовую babel + Browserify, і у мене є файл JSON у каталозі ./i18n/locale-en.json з простором імен перекладів (для використання з ngTranslate).

Не потребуючи жодного експорту з файлу JSON (який не можливий), я міг би імпортувати його вміст за замовчуванням за допомогою цього синтаксису:

import translationsJSON from './i18n/locale-en';

13

Якщо ви використовуєте вузол, ви можете:

const fs = require('fs');

const { config } = JSON.parse(fs.readFileSync('../config.json', 'utf8')) // May be incorrect, haven't used fs in a long time

АБО

const evaluation = require('../config.json');
// evaluation will then contain all props, so evaluation.config
// or you could use:
const { config } = require('../config.json');

Ще:

// config.js
{
// json object here
}

// script.js

import { config } from '../config.js';

АБО

import * from '../config.json'

9

Залежно від інструменту побудови та структури даних у файлі JSON, можливо, знадобиться імпорт файлу default.

import { default as config } from '../config.json';

наприклад використання в межах Next.js


Додана примітка для TypeScript - це переконатися, що resolveJsonModuleзнаходиться trueу вас tsconfig.json.
Пат Мільяччо

1
працював чудово! При імпорті json та зберіганні його у змінній це рішення працює.
JP Бала Крішна

1

Трохи пізно, але я просто натрапив на ту ж проблему, намагаючись надати аналітику для свого веб-додатка, який передбачав надсилання версії програми на основі версії package.json.

Конфігурація така: React + Redux, Webpack 3.5.6

Завантажувач json не дуже багато працює з Webpack 2+, тому після деякого поводження з ним я закінчив його видаляти.

Рішення, яке насправді спрацьовувало для мене, було просто за допомогою вибору. Хоча це, швидше за все, примусить змінити код, щоб адаптуватися до асинхронного підходу, воно спрацювало чудово, особливо зважаючи на той факт, що fetch запропонує json-декодування на льоту.

Отже ось це:

  fetch('../../package.json')
  .then(resp => resp.json())
  .then((packageJson) => {
    console.log(packageJson.version);
  });

Майте на увазі, що оскільки ми спеціально тут говоримо про package.json, файл зазвичай не надходить у комплект виробничої збірки (або навіть розробник для цього), тому вам доведеться використовувати CopyWebpackPlugin, щоб мати доступ до це при використанні вибору.


Не можу Файл не підтримує локальний файл ... Можливо, ви використовуєте polyfill або щось подібне.
сапі

@sapy місяців пізно відповісти, але принести API більшість абсолютно робить підтримує завантаження з шляхів без вказівки імені хоста сервера, а також завантаження з відносними шляхами. Те, про що ви думаєте, це завантаження з file:///URL-адрес, а це не те, що відбувається тут.
Джеймі

1

У веб-переглядачі із завантаженням (в основному їх зараз):

На даний момент ми не можемо importфайли з мімою типу JSON, лише файли з типом mime JavaScript. Це може бути додана функція в майбутньому ( офіційне обговорення ).

fetch('./file.json')
  .then(response => response.json())
  .then(obj => console.log(obj))

У Node.js v13.2 +:

На даний момент потрібен --experimental-json-modulesпрапор , інакше він не підтримується за замовчуванням.

Спробуйте запустити

node --input-type module --experimental-json-modules --eval "import obj from './file.json'; console.log(obj)"

і перегляньте вміст obj, що виводиться на консоль.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.