y a-t-il un besoin pour json dans node.js

247

Je voudrais inclure quelques fichiers JSON dans mon code JavaScript qui se trouvent dans le même répertoire que mon fichier source JavaScript.

Si je voulais inclure un autre fichier JavaScript, je pourrais simplement l'utiliser require. Maintenant, j'utilise readFileSyncet __dirnamepour obtenir le JSON, ce qui, à mon avis, est une mauvaise façon de le faire.

Existe-t-il quelque chose de similaire pour require qui me permet de charger un fichier JSON?

Coen
la source
Voir cette question similaire: stackoverflow.com/questions/4662851/…
Holygeek
@coen Qu'entendez-vous par "inclure un fichier JSON"? Lire et analyser? Si oui, doublon possible de: stackoverflow.com/questions/5726729/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
2
Oui; lire et analyser. Mais c'est spécifiquement la lecture d'un fichier , similaire à la lecture d'un fichier js, donc ce n'est pas un doublon et la réponse de goatslacker est toujours valide.
Coen

Réponses:

455

À partir du nœud v0.5.x oui, vous pouvez exiger votre JSON comme vous auriez besoin d'un fichier js.

var someObject = require('./somefile.json')

Dans ES6:

import someObject from ('./somefile.json')

chèvre
la source
1
Est-ce vrai? Cela ne fonctionne pas pour moi, et github.com/joyent/node/issues/1357 et github.com/joyent/node/pull/584 suggèrent que cela ne devrait pas.
user161642
12
Vous devez utiliser require ('./ somefile.json') en supposant que le fichier se trouve dans le même répertoire (notez le point et la barre oblique).
Steve Willcock
66
Il y a un problème avec ça. Le résultat sera mis en cache! Donc, si pour une raison quelconque vous avez besoin de charger à nouveau les données (par exemple lors d'un cronjob), vous obtiendrez le même ancien résultat.
Juho Vepsäläinen
41
Remarque: l'extension .jsonsemble avoir de l'importance
nha
9
json bien formé aide aussi
sdeburca
40

Les fichiers JSON ne nécessitent pas de déclaration d'exportation explicite. Vous n'avez pas besoin d'exporter pour l'utiliser comme fichiers Javascript.

Ainsi, vous pouvez utiliser uniquement requirepour un document JSON valide.

data.json

{
  "name": "Freddie Mercury"
}

main.js

var obj = require('data.json');

console.log(obj.name); 
//Freddie Mercury
serkan
la source
20

Non. Utilisez soit readFileou readFileSync(ce dernier uniquement au moment du démarrage).

Ou utilisez une bibliothèque existante comme

Vous pouvez également écrire votre configuration dans un fichier js plutôt qu'un fichier json comme

module.exports = {
  // json
}
Raynos
la source
1
@coen oui, nous utilisons toujours __dirnamepour faire des chemins relatifs.
Raynos
Ran dans cela où il importera JSON localement mais pas dans le conteneur Docker sur mon instance EC2 dans AWS ... Au lieu d'essayer de configurer les types MIME et ce qui ne l'est pas, je suis simplement passé à JS au lieu de JSON. J'espère que cela peut aider quelqu'un.
Erik Grosskurth
17

Deux des plus courants

Première voie:

let jsonData = require('./JsonFile.json')

let jsonData = require('./JsonFile') // si nous omettons .json fonctionne aussi

OU

import jsonData from ('./JsonFile.json')

Deuxième voie:

1) de manière synchrone

const fs = require('fs')
let jsonData = JSON.parse(fs.readFileSync('JsonFile.json', 'utf-8'))

2) de manière asynchrone

const fs = require('fs')
let jsonData = {}
fs.readFile('JsonFile.json', 'utf-8', (err, data) => {
  if (err) throw err

  jsonData = JSON.parse(data)
})

Remarque: 1) si nous JsonFile.json est modifié, nous n'obtenons pas les nouvelles données, même si nous réexécutons require ('./ JsonFile.json')

2) Le fichier fs.readFile ou fs.readFileSync relira toujours le fichier et obtiendra les modifications

rajmobiapp
la source
Notez que la méthode fs utilise le répertoire d'où le nœud a été lancé comme point de départ, et non le répertoire où réside le code source effectuant la lecture, tandis que la méthode "require" utilise le chemin d'accès relatif à l'emplacement du code source importateur. Ainsi, vous aurez des différences de chemin entre les deux méthodes dès que vous stockez des choses dans des dossiers différents.
Will59
3

Vous pouvez même utiliser require de votre JSON sans spécifier l'extension .json . Il vous permettra de modifier l'extension du fichier en .js sans aucune modification de vos importations.

en supposant que nous avons ./myJsonFile.json dans le même répertoire.

const data = require('./myJsonFile')

Si à l'avenir vous changerez ./myJsonFile.json en ./myJsonFile.js, rien ne devrait être changé lors de l'importation.

Igor Litvinovich
la source
1

Vous pouvez importer des fichiers json à l'aide de l'indicateur de modules json expérimentaux node.js v14. Plus de détails ici

file.js

import data from './folder/file.json'

export default {
  foo () {
    console.log(data)
  }
}

Et tu l'appelles avec node --experimental-json-modules file.js

cata-lock
la source