existe uma necessidade de json no node.js

247

Gostaria de incluir alguns arquivos JSON no meu código JavaScript que estão no mesmo diretório do meu arquivo de origem JavaScript.

Se eu quisesse incluir outro arquivo JavaScript, poderia simplesmente usar require. Agora estou usando readFileSynce __dirnamepara obter o JSON, que acho uma maneira feia de fazê-lo.

Existe algo semelhante para o require que me permite carregar um arquivo JSON?

Coen
fonte
Veja esta questão semelhante: stackoverflow.com/questions/4662851/...
holygeek
@coen O que você quer dizer com "incluir um arquivo JSON"? Ler e analisar? Se sim, possível duplicata de: stackoverflow.com/questions/5726729/...
Ciro Santilli郝海东冠状病六四事件法轮功
2
sim; leia e analise. Mas isso é especificamente ler um arquivo , semelhante à leitura de um arquivo js, ​​portanto, isso não é duplicado e a resposta do goatslacker ainda é válida.
Coen

Respostas:

454

No nó v0.5.x, sim, você pode exigir seu JSON da mesma forma que exigiria um arquivo js.

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

No ES6:

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

goatslacker
fonte
1
Isso é verdade? Não está funcionando para mim, e github.com/joyent/node/issues/1357 e github.com/joyent/node/pull/584 sugerem que não deveria.
user161642
12
Você precisa usar require ('./ somefile.json') assumindo que o arquivo esteja no mesmo diretório (observe o ponto e a barra).
Steve Willcock
66
Há uma pegadinha com isso. O resultado será armazenado em cache! Portanto, se por algum motivo precisar carregar os dados novamente (digamos em um cronjob), você obterá o mesmo resultado antigo.
Juho Vepsäläinen
41
Nota: a extensão .jsonparece importar
nha
9
json bem formados ajuda muito
sdeburca
40

Os arquivos JSON não requerem uma declaração de exportação explícita. Você não precisa exportar para usá-lo como arquivos Javascript.

Portanto, você pode usar apenas requirepara documento JSON válido.

data.json

{
  "name": "Freddie Mercury"
}

main.js

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

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

Não. Use readFileou readFileSync(Este último apenas no momento da inicialização).

Ou use uma biblioteca existente como

Como alternativa, escreva sua configuração em um arquivo js em vez de um arquivo json como

module.exports = {
  // json
}
Raynos
fonte
1
@ coen sim, sempre usamos __dirnamepara fazer caminhos relativos.
Raynos
Deparei com isso onde ele importará JSON localmente, mas não no contêiner de docker da minha instância do EC2 na AWS ... Em vez de tentar configurar tipos mime e o que não, mudei para JS em vez de JSON. Espero que isso ajude alguém.
Erik Grosskurth 23/07/19
17

Dois dos mais comuns

Primeira maneira:

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

let jsonData = require('./JsonFile') // se omitir .json também funciona

OU

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

Segunda maneira:

1) síncrona

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

2) assincronamente

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 o JsonFile.json for alterado, não obteremos os novos dados, mesmo se executarmos o require ('./ JsonFile.json')

2) O fs.readFile ou fs.readFileSync sempre lerá o arquivo e obterá alterações

rajmobiapp
fonte
Observe que o método fs usa o diretório em que o nó foi iniciado como ponto de partida, não o diretório em que reside o código-fonte que faz a leitura, enquanto o método "require" usa o caminho relativo ao local do código-fonte importado. Portanto, você terá diferenças nos caminhos entre os dois métodos assim que armazenar coisas em pastas diferentes.
Will59
3

Você ainda pode usar exigir do seu JSON sem especificar a extensão .json . Ele permitirá que você altere a extensão do arquivo para .js sem nenhuma alteração nas suas importações.

assumindo que temos ./myJsonFile.json no mesmo diretório.

const data = require('./myJsonFile')

Se no futuro você mudar ./myJsonFile.json para ./myJsonFile.js, nada deverá ser alterado na importação.

Igor Litvinovich
fonte