Comment importer un fichier json dans ecmascript 6?

163

Comment puis-je accéder à un fichier json dans Ecmascript 6? Ce qui suit ne fonctionne pas:

import config from '../config.json'

Cela fonctionne bien si j'essaye d'importer un fichier JavaScript.

Nikita Jajodia
la source
4
Cela n'a rien à voir avec ES6 mais avec le chargeur de module que vous utilisez. La syntaxe elle-même est correcte.
Felix Kling
2
La façon la plus propre de le faire est de l'utiliser webpacket json-loaderavec elle.
suprita shankar
11
ES6 prend en charge l'importation JSON avec la syntaxe suivante: import * en tant que données de './example.json';
williamli

Réponses:

84

Une solution de contournement simple:

config.js

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

puis...

import config from '../config.js'

n'autorise pas l'importation de fichiers .json existants, mais effectue un travail.

Gilbert
la source
172
Cela ne répond pas vraiment à la question. Vous ne pouvez pas simplement convertir votre package.json en package.js par exemple. Il y a des moments où vous voulez vraiment importer du JSON et non du JS.
curiousdannii
23
Pas du tout une solution, vous exportez un objet javascript qui se trouve avoir la même syntaxe que JSON.
Ma Jerez
Mise à jour du texte du problème; tenter d'éviter d'autres débats sémantiques.
Gilbert
J'ai ajouté une "postbuild": "node myscript.js"étape dans mon fichier package.json qui utilise replace-in-file pour le faire pour moi. 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
"le convertir en JS" n'est pas une solution pour savoir comment importer un fichier JSON. Ce n'est plus un fichier JSON. Il s'agit d'un résultat google n ° 1 sur la façon d'importer JSON, et la réponse principale est de ne pas importer JSON.
Jimbo Jonny
119

Dans TypeScript ou en utilisant Babel, vous pouvez importer un fichier json dans votre code.

// Babel

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

Référence: https://hackernoon.com/import-json-into-typescript-8d465beded79

Williamli
la source
13
Juste pour ajouter à cela (importation json dactylographiée), vous pouvez maintenant simplement ajouter ceci à votre tsconfig ... {"compilerOptions": {"resolutionJsonModule": true}}
Matt Coady
4
Est-ce que certains navigateurs prennent en charge cela? J'ai essayé ceci sur FF actuel et j'ai obtenu l'erreur Loading failed for the module with source "example.json"; sur Chrome, j'obtiens "Échec du chargement du script du module: le serveur a répondu avec un type MIME non JavaScript de" application / json ". Une vérification stricte du type MIME est appliquée pour les scripts de module selon les spécifications HTML."
Coderer
@Coderer cela fonctionne sur tous mes navigateurs. La prise en charge ES6 / ES2015 est-elle activée?
williamli
2
Cela m'est venu à l'esprit, quand vous dites "dans ES6", vous voulez dire "dans TS" - je pensais que vous parliez du code émis par tscmais ce n'est pas vraiment ce qui se passe. J'essaie d'exécuter des modules ES6 de manière native sur le navigateur ( <script type="module">) et les erreurs ci-dessus sont ce que vous obtenez si vous exécutez cette importligne directement. Veuillez me corriger si je me trompe et que vous vouliez en fait dire qu'il est possible d'importer depuis JSON dans ES6 réel.
Coderer
3
Quand j'ai dit "Est-ce que les navigateurs acceptent cela", je ne voulais pas dire "après l'avoir transpilé via Babel". Le premier article que vous avez lié a TS transpilant l' importinstruction vers un nœud require()(essayez-le!), Et le deuxième lien ne dit rien sur les importations JSON. Le problème ici n'est pas avec l'analyseur ou le système de modules, c'est le chargeur - le chargeur du navigateur ne résoudra pas une importation pour autre chose que Javascript. Sous le capot, vous devez toujours utiliser un appel AJAX (fetch / XHR) et analyser le résultat, même si votre chaîne d'outils de construction résume cela.
Coderer
67

Malheureusement, ES6 / ES2015 ne prend pas en charge le chargement de JSON via la syntaxe d'importation de module. Mais ...

Il y a plusieurs façons de le faire. En fonction de vos besoins, vous pouvez soit examiner comment lire des fichiers en JavaScript (cela window.FileReaderpeut être une option si vous utilisez le navigateur), soit utiliser d'autres chargeurs comme décrit dans d' autres questions (en supposant que vous utilisez NodeJS).

Le moyen le plus simple de l'OMI est probablement de simplement mettre le JSON en tant qu'objet JS dans un module ES6 et de l'exporter. De cette façon, vous pouvez simplement l'importer là où vous en avez besoin.

A noter également si vous utilisez Webpack, l'importation de fichiers JSON fonctionnera par défaut (depuis webpack >= v2.0.0).

import config from '../config.json';
Simone
la source
5
Il n'est pas nécessaire de le mettre dans une chaîne. Cela s'appelle JSON, pas JSSN, après tout.
un meilleur oliver le
4
De plus, torazaburo a expliqué dans une réponse précédemment supprimée: Il n'y a pas de "système de module" ES6; il existe une API qui est implémentée par un chargeur particulier. Tout chargeur peut faire tout ce qu'il veut, y compris prendre en charge l'importation de fichiers JSON. Par exemple, un chargeur peut choisir de prendre en charge l'importation foo de './directory comme signifiant importer le répertoire / index.js
CodingIntrigue
5
en fait ES6 / ES2015 prennent en charge le chargement de JSON via la syntaxe d'importation: import * en tant que données de './example.json';
williamli
+1 pour le rappel que Webpack le fait automatiquement. Attention cependant, si vous avez "test: /.js/", webpack tentera de compiler votre fichier json en JavaScript. #échouer. Pour résoudre ce problème, changez-le en "test: /.js$/"
Rap
webpack est basé sur nodejs, n'est-ce pas?
Ayyash
20

J'utilise babel + browserify et j'ai un fichier JSON dans un répertoire ./i18n/locale-en.json avec un espace de noms de traductions (à utiliser avec ngTranslate).

Sans avoir à exporter quoi que ce soit du fichier JSON (ce qui n'est pas possible au btw), je pourrais faire une importation par défaut de son contenu avec cette syntaxe:

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

Si vous utilisez node, vous pouvez:

const fs = require('fs');

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

OU

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

Autre:

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

// script.js

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

OU

import * from '../config.json'
Utilisateur anonyme 2903
la source
9

En fonction de vos outils de construction et de la structure de données dans le fichier JSON, il peut être nécessaire d'importer le fichier default.

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

par exemple utilisation dans Next.js

Pat Migliaccio
la source
Une note supplémentaire pour TypeScript est de s'assurer qu'il resolveJsonModuleest trueen vous tsconfig.json.
Pat Migliaccio
1
a parfaitement fonctionné! Lors de l'importation de json et de son stockage dans une variable, cette solution fonctionne.
JP Bala Krishna
1

Un peu tard, mais je suis juste tombé sur le même problème en essayant de fournir des analyses pour mon application Web qui impliquait l'envoi de la version de l'application basée sur la version package.json.

La configuration est la suivante: React + Redux, Webpack 3.5.6

Le json-loader ne fait pas grand-chose depuis Webpack 2+, donc après quelques manipulations, j'ai fini par le supprimer.

La solution qui a fonctionné pour moi était simplement d'utiliser fetch. Bien que cela imposera très probablement des changements de code pour s'adapter à l'approche asynchrone, cela a parfaitement fonctionné, d'autant plus que fetch offrira un décodage json à la volée.

Alors voilà:

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

Gardez à l'esprit que, puisque nous parlons spécifiquement de package.json ici, le fichier ne sera généralement pas inclus dans votre version de production (ou même dans le développement), vous devrez donc utiliser le CopyWebpackPlugin pour avoir accès à lors de l'utilisation de fetch.

Avram Tudor
la source
Je ne peux pas. Fetch ne prend pas en charge les fichiers locaux ... Vous utilisez peut-être polyfill ou quelque chose comme ça.
sapy
@sapy Réponse tardive de plusieurs mois, mais l'API fetch prend absolument en charge le chargement à partir de chemins sans spécifier le nom d'hôte du serveur, ainsi que le chargement à partir de chemins relatifs. Ce à quoi vous pensez, c'est le chargement à partir d' file:///URL, ce qui n'est pas ce qui se passe ici.
Jamie Ridding
1

Dans un navigateur avec fetch (pratiquement tous maintenant):

Pour le moment, nous ne pouvons pas les importfichiers avec un type mime JSON, uniquement les fichiers avec un type mime JavaScript. Cela pourrait être une fonctionnalité ajoutée à l'avenir ( discussion officielle ).

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

Dans Node.js v13.2 +:

Il nécessite actuellement l' --experimental-json-modulesindicateur , sinon il n'est pas pris en charge par défaut.

Essayez de courir

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

et voir le contenu obj sorti sur la console.

trusktr
la source