Come importare un file json in ecmascript 6?


163

Come posso accedere a un file json in Ecmascript 6? Quanto segue non funziona:

import config from '../config.json'

Funziona bene se provo a importare un file JavaScript.


4
Questo non ha nulla a che fare con ES6 ma con il caricatore di moduli che si sta utilizzando. La sintassi stessa va bene.
Felix Kling,

2
Il modo più pulito per farlo è usare webpacke json-loadercon esso.
Suprita Shankar,

11
ES6 supporta l'importazione JSON con la seguente sintassi: import * as data from './example.json';
williamli,

Risposte:


84

Una soluzione semplice:

config.js

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

poi...

import config from '../config.js'

non consente l'importazione di file .json esistenti, ma svolge un lavoro.


172
Questo in realtà non risponde alla domanda. Ad esempio, non puoi semplicemente convertire package.json in package.js. Ci sono momenti in cui vuoi veramente importare JSON non JS.
curiousdannii il

23
Non è affatto una soluzione, stai esportando un oggetto javascript che sembra avere la stessa sintassi di JSON.
Ma Jerez,

Aggiornato il testo del problema; tenta di evitare ulteriori dibattiti semantici.
Gilbert,

Ho aggiunto un "postbuild": "node myscript.js"passaggio al mio file package.json che utilizza il file di sostituzione per farlo per me. 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
"convertilo in JS" non è una soluzione per importare un file JSON. Questo non è più un file JSON. Questo è un risultato google numero 1 per come importare JSON e la risposta principale è non importare JSON.
Jimbo Jonny il

119

In TypeScript o usando Babel, puoi importare file json nel tuo codice.

// Babel

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

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


13
Solo per aggiungere a questo (dattiloscritto importazione json) ora puoi semplicemente aggiungere questo al tuo tsconfig ... {"compilerOptions": {"solveJsonModule": true}}
Matt Coady,

4
Alcuni browser lo supportano? Ho provato questo su FF corrente e ottengo l'errore Loading failed for the module with source "example.json"; su Chrome ottengo "Impossibile caricare lo script del modulo: il server ha risposto con un tipo MIME non JavaScript di" application / json ". Il controllo rigoroso del tipo MIME è applicato per gli script del modulo per specifica HTML."
Coderer

@Coderer funziona su tutti i miei browser. Il supporto ES6 / ES2015 è abilitato?
williamli,

2
Mi è appena venuto in mente quando dici "in ES6" in realtà intendi "in TS" - Pensavo che stessi parlando del codice emesso , tscma in realtà non è quello che sta succedendo. Sto cercando di eseguire i moduli ES6 in modo nativo sul browser ( <script type="module">) e gli errori sopra sono ciò che ottieni se esegui quella importlinea direttamente. Per favore, correggimi se sbaglio e in realtà significa che è possibile importare da JSON nell'ES6 attuale.
Coderer,

3
Quando ho detto "Supporta questo browser", non intendevo "dopo averlo trasposto attraverso Babel". Il primo articolo che hai collegato ha TS che traspila l' importistruzione in un nodo require()(provalo!), E il secondo link non dice nulla sulle importazioni di JSON. Il problema qui non è con il parser o il sistema del modulo, è il caricatore: il caricatore del browser non risolverà un'importazione per qualsiasi cosa diversa da Javascript. Sotto il cofano, devi sempre usare una chiamata AJAX (fetch / XHR) e analizzare il risultato, anche se la tua toolchain di build lo astrae.
Coderer,

67

Sfortunatamente ES6 / ES2015 non supporta il caricamento di JSON tramite la sintassi di importazione del modulo. Ma ...

Ci sono molti modi per farlo. A seconda delle tue esigenze puoi esaminare come leggere i file in JavaScript ( window.FileReaderpotrebbe essere un'opzione se stai eseguendo nel browser) o usare altri caricatori come descritto in altre domande (supponendo che tu stia utilizzando NodeJS).

Il modo più semplice per IMO è probabilmente quello di inserire JSON come oggetto JS in un modulo ES6 ed esportarlo. In questo modo puoi semplicemente importarlo dove ti serve.

Vale anche la pena notare che se si utilizza Webpack, l'importazione di file JSON funzionerà per impostazione predefinita (poiché webpack >= v2.0.0).

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

5
Non è necessario inserirlo in una stringa. Dopotutto si chiama JSON, non JSSN.
un oliver migliore il

4
Inoltre, torazaburo ha spiegato in una risposta precedentemente cancellata: non esiste un "sistema di moduli" ES6; c'è un'API che è implementata da un particolare caricatore. Qualsiasi caricatore può fare tutto ciò che vuole, incluso il supporto all'importazione di file JSON. Ad esempio, un caricatore potrebbe scegliere di supportare import foo da './directory come significato per importare directory / index.js
CodingIntrigue

5
infatti ES6 / ES2015 supportano il caricamento di JSON tramite la sintassi di importazione: import * come dati da './example.json';
William

+1 per il promemoria che Webpack lo fa automaticamente. Tuttavia, se hai il webpack "test: /.js/" tenterai di compilare il tuo file json come JavaScript. #fallire. Per risolverlo, cambiarlo per dire "test: /.js$/"
Rap

il webpack si basa su nodejs, vero?
Ayyash,

20

Sto usando babel + browserify e ho un file JSON in una directory ./i18n/locale-en.json con spazio dei nomi delle traduzioni (da usare con ngTranslate).

Senza dover esportare nulla dal file JSON (che tra l'altro non è possibile), potrei effettuare un'importazione predefinita del suo contenuto con questa sintassi:

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

13

Se stai usando il nodo puoi:

const fs = require('fs');

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

O

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

Altro:

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

// script.js

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

O

import * from '../config.json'

9

A seconda degli strumenti di compilazione e della struttura dei dati all'interno del file JSON, potrebbe essere necessario importare il file default.

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

ad es. utilizzo all'interno Next.js


La nota aggiunta per TypeScript è assicurarsi che resolveJsonModulesia truein te tsconfig.json.
Pat Migliaccio,

1
ha funzionato perfettamente! Quando si importa json e lo si memorizza in una variabile, questa soluzione funziona.
JP Bala Krishna,

1

Un po 'in ritardo, ma mi sono imbattuto nello stesso problema durante il tentativo di fornire analisi per la mia app Web che prevedeva l'invio della versione dell'app basata sulla versione package.json.

La configurazione è la seguente: React + Redux, Webpack 3.5.6

Il json-loader non sta facendo molto dal Webpack 2+, quindi dopo averlo armeggiato, ho finito per rimuoverlo.

La soluzione che funzionava davvero per me, era semplicemente usare il recupero. Anche se questo probabilmente imporrà alcune modifiche al codice per adattarsi all'approccio asincrono, ha funzionato perfettamente, soprattutto dato che il recupero offrirà la decodifica json al volo.

Quindi eccolo qui:

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

Tieni presente che, dal momento che stiamo parlando di package.json in particolare qui, il file di solito non verrà raggruppato nella build di produzione (o anche dev per quella materia), quindi dovrai usare CopyWebpackPlugin per avere accesso a quando si utilizza fetch.


Non posso. Il recupero non supporta il file locale ... È possibile che tu stia usando polyfill o qualcosa del genere.
sapy,

Mesi @sapy ritardo di risposta, ma l'API prendere più assolutamente fa supporto di carico dai percorsi senza specificare il nome host del server, così come carico da percorsi relativi. Quello che stai pensando è il caricamento dagli file:///URL, che non è quello che sta succedendo qui.
Jamie Ridding,

1

In un browser con recupero (praticamente tutti ora):

Al momento, non possiamo importfile con un tipo MIME JSON, solo file con un tipo MIME JavaScript. Potrebbe essere una funzionalità aggiunta in futuro ( discussione ufficiale ).

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

In Node.js v13.2 +:

Al momento richiede il --experimental-json-modulesflag , altrimenti non è supportato per impostazione predefinita.

Prova a correre

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

e vedere il contenuto obj inviato alla console.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.