Gibt es eine Anforderung für json in node.js?

247

Ich möchte ein paar JSON-Dateien in meinen JavaScript-Code aufnehmen, die sich im selben Verzeichnis wie meine JavaScript-Quelldatei befinden.

Wenn ich eine andere JavaScript-Datei einfügen wollte, konnte ich sie einfach verwenden require. Jetzt benutze ich readFileSyncund __dirnamebekomme den JSON, was ich für einen hässlichen Weg halte.

Gibt es etwas Ähnliches für require, mit dem ich eine JSON-Datei laden kann?

Coen
quelle
Siehe diese ähnliche Frage: stackoverflow.com/questions/4662851/…
Holygeek
@coen Was meinst du mit "JSON-Datei einschließen"? Lesen und analysieren? Wenn ja, mögliches Duplikat von: stackoverflow.com/questions/5726729/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
2
Ja; lesen und analysieren. Dies ist jedoch speziell das Lesen einer Datei , ähnlich wie das Lesen einer js-Datei. Dies ist also kein Duplikat und die Antwort von goatslacker ist weiterhin gültig.
Coen

Antworten:

454

Ab Knoten v0.5.x können Sie Ihren JSON genauso benötigen, wie Sie eine js-Datei benötigen würden.

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

In ES6:

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

Ziegenschläger
quelle
1
Ist das wahr? Es funktioniert nicht für mich und github.com/joyent/node/issues/1357 und github.com/joyent/node/pull/584 schlagen vor, dass es nicht sollte.
user161642
12
Sie müssen require ('./ somefile.json') verwenden, vorausgesetzt, die Datei befindet sich im selben Verzeichnis (beachten Sie den Punkt und den Schrägstrich).
Steve Willcock
66
Da ist ein Gotcha dabei. Das Ergebnis wird zwischengespeichert! Wenn Sie also aus irgendeinem Grund die Daten erneut laden müssen (z. B. bei einem Cronjob), erhalten Sie das gleiche alte Ergebnis.
Juho Vepsäläinen
41
Hinweis: Die Erweiterung .jsonscheint wichtig zu sein
nha
9
gut geformter json hilft auch
sdeburca
40

JSON-Dateien erfordern keine explizite Exportanweisung. Sie müssen nicht exportieren, um es als Javascript-Dateien zu verwenden.

Sie können also nur ein requiregültiges JSON-Dokument verwenden.

data.json

{
  "name": "Freddie Mercury"
}

main.js

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

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

Nein. Entweder verwenden readFileoder readFileSync(Letzteres nur zum Startzeitpunkt).

Oder verwenden Sie eine vorhandene Bibliothek wie

Alternativ schreiben Sie Ihre Konfiguration in eine JS-Datei anstatt in eine JSON-Datei wie

module.exports = {
  // json
}
Raynos
quelle
1
@coen ja, wir verwenden immer __dirnamerelative Pfade.
Raynos
Ich bin darauf gestoßen, wo JSON lokal importiert wird, aber nicht im Docker-Container meiner EC2-Instanz in AWS ... Anstatt zu versuchen, MIME-Typen zu konfigurieren und was nicht, habe ich einfach zu JS anstelle von JSON gewechselt. Hoffe das kann jemandem helfen.
Erik Grosskurth
17

Zwei der häufigsten

Erster Weg:

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

let jsonData = require('./JsonFile') // Wenn wir .json weglassen, funktioniert das auch

ODER

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

Zweiter Weg:

1) synchron

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

2) asynchron

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

  jsonData = JSON.parse(data)
})

Hinweis: 1) Wenn wir JsonFile.json ändern, erhalten wir die neuen Daten nicht, selbst wenn wir require ('./ JsonFile.json') erneut ausführen.

2) Die Datei fs.readFile oder fs.readFileSync liest die Datei immer wieder und erhält Änderungen

Rajmobiapp
quelle
Beachten Sie, dass die fs-Methode das Verzeichnis verwendet, von dem aus der Knoten gestartet wurde, als Ausgangspunkt, nicht das Verzeichnis, in dem sich der Quellcode befindet, der den Lesevorgang ausführt, während die Methode "require" den Pfad relativ zum importierenden Quellcode-Speicherort verwendet. Sie haben also unterschiedliche Pfade zwischen den beiden Methoden, sobald Sie Dinge in verschiedenen Ordnern speichern.
Will59
3

Sie können require von Ihrem JSON sogar verwenden , ohne die Erweiterung .json anzugeben . Damit können Sie die Dateierweiterung in .js ändern, ohne Ihre Importe zu ändern .

Angenommen, wir haben ./myJsonFile.json im selben Verzeichnis.

const data = require('./myJsonFile')

Wenn Sie in Zukunft ./myJsonFile.json in ./myJsonFile.js ändern , sollte beim Import nichts geändert werden.

Igor Litvinovich
quelle