c'è un requisito per json in node.js


247

Vorrei includere un paio di file JSON nel mio codice JavaScript che si trovano nella stessa directory del mio file di origine JavaScript.

Se volessi includere un altro file JavaScript potrei semplicemente usare require. Ora sto usando readFileSynce __dirnameper ottenere il JSON, che penso sia un brutto modo di farlo.

Esiste qualcosa di simile per il requisito che mi consente di caricare un file JSON?


Vedere questa domanda simile: stackoverflow.com/questions/4662851/...
holygeek

@coen Cosa intendi con "includi un file JSON"? Leggi e analizzalo? Se sì, possibile duplicato di: stackoverflow.com/questions/5726729/...
Ciro Santilli郝海东冠状病六四事件法轮功

2
sì; leggi e analizza. Ma questo è in particolare la lettura di un file , simile alla lettura di un file js, quindi non è un duplicato e la risposta del goatslacker è ancora valida.
Coen,

Risposte:


455

A partire dal nodo v0.5.x sì, puoi richiedere il tuo JSON proprio come avresti bisogno di un file js.

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

In ES6:

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


1
È vero? Non funziona per me e github.com/joyent/node/issues/1357 e github.com/joyent/node/pull/584 suggeriscono che non dovrebbe.
user161642

12
Devi usare il requisito ('./ somefile.json') supponendo che il file sia nella stessa directory (nota il punto e la barra).
Steve Willcock,

66
C'è un gotcha con questo. Il risultato verrà memorizzato nella cache! Quindi, se per qualche motivo hai bisogno di caricare nuovamente i dati (diciamo ad un cronjob), otterrai lo stesso vecchio risultato.
Juho Vepsäläinen,

41
Nota: l'estensione .jsonsembra avere importanza
nha

9
anche
Json

40

I file JSON non richiedono un'istruzione di esportazione esplicita. Non è necessario esportare per usarlo come file Javascript.

Quindi, puoi usare solo requireper un documento JSON valido.

data.json

{
  "name": "Freddie Mercury"
}

main.js

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

console.log(obj.name); 
//Freddie Mercury

20

No. Utilizzare readFileo readFileSync(Quest'ultimo solo al momento dell'avvio).

Oppure usa una libreria esistente come

In alternativa, scrivi la tua configurazione in un file js piuttosto che in un file json come

module.exports = {
  // json
}

1
@coen sì, usiamo sempre __dirnameper creare percorsi relativi.
Raynos,

Sono entrato in questo dove importerà JSON localmente ma non nel contenitore docker sulla mia istanza EC2 in AWS ... Invece di provare a configurare i tipi mime e cosa no, sono passato a JS anziché a JSON. Spero che questo possa aiutare qualcuno.
Erik Grosskurth,

17

Due dei più comuni

Primo modo:

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

let jsonData = require('./JsonFile') // se omettiamo .json funziona anche

O

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

Secondo modo:

1) in modo sincrono

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

2) in modo asincrono

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

  jsonData = JSON.parse(data)
})

Nota: 1) se JsonFile.json viene modificato, non otteniamo i nuovi dati, anche se eseguiamo nuovamente richiedi ('./ JsonFile.json')

2) fs.readFile o fs.readFileSync rileggeranno sempre il file e riceveranno le modifiche


Si noti che il metodo fs utilizza la directory da cui il nodo è stato avviato come punto iniziale, non la directory in cui risiede il codice sorgente che esegue la lettura, mentre il metodo "request" utilizza il percorso relativo alla posizione del codice sorgente di importazione. Quindi avrai differenze nei percorsi tra i due metodi non appena memorizzi le cose in cartelle diverse.
Will59,

3

È anche possibile utilizzare richiedere del vostro JSON senza specificare l'estensione .json . Ti permetterà di cambiare l'estensione del file in .js senza alcuna modifica nelle tue importazioni.

supponendo che abbiamo ./myJsonFile.json nella stessa directory.

const data = require('./myJsonFile')

Se in futuro cambierai ./myJsonFile.json in ./myJsonFile.js, nulla dovrebbe essere cambiato durante l'importazione.


1

È possibile importare file json utilizzando il flag di moduli json sperimentali node.js v14. Maggiori dettagli qui

file.js

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

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

E lo chiami con node --experimental-json-modules file.js

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.