Bagaimana cara mengimpor file json di ecmascript 6?

163

Bagaimana saya bisa mengakses file json di Ecmascript 6? Berikut ini tidak berfungsi:

import config from '../config.json'

Ini berfungsi dengan baik jika saya mencoba mengimpor file JavaScript.

Nikita Jajodia
sumber
4
Ini tidak ada hubungannya dengan ES6 tetapi dengan pemuat modul yang Anda gunakan. Sintaksnya sendiri baik-baik saja.
Felix Kling
2
Cara terbersih untuk melakukan ini adalah menggunakan webpackdan json-loaderdengannya.
suprita shankar
11
ES6 mendukung impor JSON dengan sintaks berikut: import * as data from './example.json';
williamli

Jawaban:

84

Solusi sederhana:

config.js

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

kemudian...

import config from '../config.js'

tidak mengizinkan impor file .json yang ada, tetapi melakukan pekerjaan.

Gilbert
sumber
172
Ini sebenarnya tidak menjawab pertanyaan. Anda tidak dapat dengan mudah mengubah package.json Anda menjadi package.js misalnya. Ada kalanya Anda ingin benar-benar mengimpor JSON bukan JS.
curiousdannii
23
Sama sekali bukan solusi, Anda mengekspor objek javascript yang kebetulan memiliki sintaks yang sama dengan JSON.
Ma Jerez
Diperbarui teks masalah; upaya untuk menghindari perdebatan semantik lebih lanjut.
Gilbert
Saya menambahkan "postbuild": "node myscript.js"langkah dalam file package.json saya yang menggunakan ganti-in-file untuk melakukan ini untuk saya. 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
"convert it to JS" bukan solusi untuk cara mengimpor file JSON. Itu bukan file JSON lagi. Ini adalah hasil google # 1 untuk cara mengimpor JSON, dan jawaban utamanya adalah tidak mengimpor JSON.
Jimbo Jonny
119

Dalam TypeScript atau menggunakan Babel, Anda dapat mengimpor file json dalam kode Anda.

// Babel

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

Referensi: https://hackernoon.com/import-json-into-typescript-8d465beded79

williamli
sumber
13
Hanya untuk menambahkan ini (impor skrip json) Anda sekarang dapat menambahkan ini ke tsconfig Anda ... {"compilerOptions": {"resolJsonModule": true}}
Matt Coady
4
Apakah ada browser yang mendukung ini? Saya mencoba ini pada FF saat ini dan mendapatkan kesalahan Loading failed for the module with source "example.json"; di Chrome saya mendapatkan "Gagal memuat skrip modul: Server merespons dengan tipe MIME non-JavaScript" application / json ". Pemeriksaan tipe MIME ketat diterapkan untuk skrip modul per spesifikasi HTML."
Coderer
@Coderer berfungsi di semua browser saya. Apakah Anda memiliki dukungan ES6 / ES2015 diaktifkan?
williamli
2
Baru saja terpikir oleh saya, ketika Anda mengatakan "dalam ES6" Anda sebenarnya berarti "dalam TS" - Saya pikir Anda berbicara tentang kode yang dipancarkan oleh tsctetapi itu tidak benar-benar apa yang terjadi. Saya mencoba menjalankan modul ES6 secara native di browser ( <script type="module">) dan kesalahan di atas adalah apa yang Anda dapatkan jika Anda menjalankan importbaris itu secara langsung. Tolong perbaiki saya jika saya salah dan Anda memang bermaksud untuk mengimpor dari JSON di ES6 yang sebenarnya.
Coderer
3
Ketika saya berkata, "Apakah ada browser yang mendukung ini," maksud saya bukan "setelah Anda mentransformasikannya melalui Babel." Artikel pertama yang Anda tautkan memiliki TS mentransmisikan importpernyataan ke sebuah noderequire() tautkan (coba saja!), Dan tautan kedua tidak mengatakan apa pun tentang impor JSON. Masalahnya di sini bukan dengan parser atau sistem modul, itu adalah pemuat - pemuat peramban tidak akan menyelesaikan impor untuk hal lain selain Javascript. Di bawah tenda, Anda selalu harus menggunakan panggilan AJAX (fetch / XHR) dan mem-parsing hasilnya, bahkan jika build tool abstrak Anda.
Coderer
67

Sayangnya ES6 / ES2015 tidak mendukung memuat JSON melalui sintaks impor modul. Tapi ...

Ada banyak cara untuk melakukannya. Tergantung pada kebutuhan Anda, Anda dapat melihat cara membaca file dalam JavaScript ( window.FileReaderbisa menjadi pilihan jika Anda menjalankan di browser) atau menggunakan beberapa loader lainnya seperti yang dijelaskan dalam pertanyaan lain (dengan asumsi Anda menggunakan NodeJS).

Cara paling sederhana IMO mungkin adalah dengan hanya menempatkan JSON sebagai objek JS ke dalam modul ES6 dan mengekspornya. Dengan begitu Anda bisa mengimpornya di tempat yang Anda butuhkan.

Juga patut dicatat jika Anda menggunakan Webpack, mengimpor file JSON akan berfungsi secara default (sejak webpack >= v2.0.0).

import config from '../config.json';
Simone
sumber
5
Tidak perlu memasukkannya ke dalam String. Lagipula disebut JSON, bukan JSSN.
oliver yang lebih baik
4
Juga, torazaburo menjelaskan dalam jawaban yang sebelumnya dihapus: Tidak ada "sistem modul" ES6; ada API yang diimplementasikan oleh loader tertentu. Setiap pemuat dapat melakukan apa pun yang diinginkannya, termasuk mendukung impor file JSON. Misalnya, sebuah loader mungkin memilih untuk mendukung impor foo dari './directory sebagai makna untuk mengimpor direktori / index.js
CodingIntrigue
5
pada kenyataannya ES6 / ES2015 mendukung memuat JSON melalui sintaks impor: impor * sebagai data dari './example.json';
williamli
+1 untuk pengingat bahwa webpack melakukannya secara otomatis. Hati-hati, jika Anda memiliki "test: /.js/" webpack akan mencoba untuk mengkompilasi file json Anda sebagai JavaScript. #gagal. Untuk memperbaikinya, ubahlah dengan mengatakan "test: /.js$/"
Rap
webpack didasarkan pada nodejs, bukan?
Ayyash
20

Saya menggunakan babel + browserify dan saya memiliki file JSON di direktori ./i18n/locale-en.json dengan terjemahan namespace (untuk digunakan dengan ngTranslate).

Tanpa harus mengekspor apa pun dari file JSON (yang tidak mungkin dilakukan oleh btw), saya dapat membuat impor default kontennya dengan sintaks ini:

import translationsJSON from './i18n/locale-en';
Francisco Neto
sumber
13

Jika Anda menggunakan simpul, Anda dapat:

const fs = require('fs');

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

ATAU

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

Lain:

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

// script.js

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

ATAU

import * from '../config.json'
Pengguna Anonim 2903
sumber
9

Bergantung pada perkakas bangunan Anda dan struktur data dalam file JSON, mungkin perlu mengimpor default.

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

mis. penggunaan di dalam Next.js

Pat Migliaccio
sumber
Catatan tambahan untuk TypeScript adalah untuk memastikan resolveJsonModuleada truedi Anda tsconfig.json.
Pat Migliaccio
1
bekerja dengan sempurna! Saat mengimpor json dan menyimpannya dalam variabel, solusi ini berfungsi.
JP Bala Krishna
1

Sedikit terlambat, tetapi saya hanya menemukan masalah yang sama ketika mencoba memberikan analisis untuk aplikasi web saya yang melibatkan pengiriman versi aplikasi berdasarkan versi package.json.

Konfigurasi adalah sebagai berikut: React + Redux, Webpack 3.5.6

Json-loader tidak melakukan banyak hal sejak Webpack 2+, jadi setelah beberapa mengutak-atiknya, saya akhirnya menghapusnya.

Solusi yang benar-benar bekerja untuk saya, hanya menggunakan fetch. Sementara ini kemungkinan besar akan memberlakukan beberapa perubahan kode untuk beradaptasi dengan pendekatan async, itu bekerja dengan sempurna, terutama mengingat fakta bahwa fetch akan menawarkan json decoding on the fly.

Jadi begini:

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

Perlu diingat, bahwa karena kita berbicara tentang package.json khusus di sini, file tersebut biasanya tidak akan disertakan dalam build produksi Anda (atau bahkan dev dalam hal ini), jadi Anda harus menggunakan CopyWebpackPlugin untuk memiliki akses ke saat menggunakan fetch.

Avram Tudor
sumber
Tidak bisa Ambil tidak mendukung file lokal ... Anda mungkin menggunakan polyfill atau sesuatu.
Sapy
@sapy Bulan keterlambatan membalas, tetapi API ambil paling tidak mendukung pemuatan dari jalur tanpa menentukan nama host server, serta pemuatan dari jalur relatif. Apa yang Anda pikirkan adalah memuat dari file:///URL, yang tidak terjadi di sini.
Jamie Ridding
1

Di browser dengan fetch (pada dasarnya semuanya sekarang):

Saat ini, kami tidak dapat importfile dengan tipe mime JSON, hanya file dengan tipe mime JavaScript. Mungkin fitur yang ditambahkan di masa depan ( diskusi resmi ).

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

Dalam Node.js v13.2 +:

Saat ini membutuhkan --experimental-json-modulesbendera , jika tidak didukung secara default.

Coba jalankan

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

dan lihat konten obj yang dikeluarkan untuk konsol.

trusktr
sumber