¿hay un requisito para json en node.js


247

Me gustaría incluir un par de archivos JSON en mi código JavaScript que están en el mismo directorio que mi archivo fuente JavaScript.

Si quisiera incluir otro archivo JavaScript, simplemente podría usarlo require. Ahora estoy usando readFileSyncy __dirnamepara obtener el JSON, que creo que es una forma fea de hacerlo.

¿Hay algo similar para require que me permita cargar un archivo JSON?



@coen ¿Qué quieres decir con "incluir un archivo JSON"? ¿Leerlo y analizarlo? En caso afirmativo, posible duplicado de: stackoverflow.com/questions/5726729/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
si; leer y analizar Pero esto es específicamente leer un archivo , similar a leer un archivo js, ​​por lo que esto no es un duplicado y la respuesta de goatslacker sigue siendo válida.
Coen

Respuestas:


455

A partir del nodo v0.5.x sí, puede requerir su JSON tal como requeriría un archivo js.

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

En ES6:

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


1
¿Es esto cierto? No me funciona, y github.com/joyent/node/issues/1357 y github.com/joyent/node/pull/584 sugieren que no debería.
user161642

12
Debe usar require ('./ somefile.json') suponiendo que el archivo esté en el mismo directorio (tenga en cuenta el punto y la barra inclinada).
Steve Willcock

66
Hay un problema con esto. ¡El resultado será almacenado en caché! Entonces, si por alguna razón necesita cargar los datos nuevamente (digamos en un cronjob), obtendrá el mismo resultado anterior.
Juho Vepsäläinen

41
Nota: la extensión .jsonparece importar
nha

99
json bien formado también ayuda
sdeburca

40

Los archivos JSON no requieren una declaración de exportación explícita. No necesita exportar para usarlo como archivos Javascript.

Por lo tanto, puede usar solo requirepara un documento JSON válido.

data.json

{
  "name": "Freddie Mercury"
}

main.js

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

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

20

No. Utilice readFileo readFileSync(este último solo en el momento del inicio).

O use una biblioteca existente como

Alternativamente, escriba su configuración en un archivo js en lugar de un archivo json como

module.exports = {
  // json
}

1
@coen sí, siempre usamos __dirnamepara hacer rutas relativas.
Raynos

Me encontré con esto donde importará JSON localmente pero no en el contenedor docker en mi instancia EC2 en AWS ... En lugar de intentar configurar los tipos MIME y lo que no, simplemente cambié a JS en lugar de JSON. Espero que esto pueda ayudar a alguien.
Erik Grosskurth

17

Dos de los mas comunes

Primera forma:

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

let jsonData = require('./JsonFile') // si omitimos .json también funciona

O

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

Segunda forma:

1) sincrónicamente

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

2) asincrónicamente

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

  jsonData = JSON.parse(data)
})

Nota: 1) si cambiamos JsonFile.json, no obtenemos los datos nuevos, incluso si volvemos a ejecutar require ('./ JsonFile.json')

2) fs.readFile o fs.readFileSync siempre volverá a leer el archivo y obtendrá cambios


Tenga en cuenta que el método fs usa el directorio desde el que se inició el nodo como punto de partida, no el directorio donde reside el código fuente que realiza la lectura, mientras que el método "require" usa la ruta relativa a la ubicación del código fuente de importación. Por lo tanto, tendrá diferencias en las rutas entre los dos métodos tan pronto como almacene cosas en diferentes carpetas.
Will59

3

Incluso puede usar require de su JSON sin especificar la extensión .json . Le permitirá cambiar la extensión del archivo a .js sin ningún cambio en sus importaciones.

suponiendo que tengamos ./myJsonFile.json en el mismo directorio.

const data = require('./myJsonFile')

Si en el futuro va a cambiar ./myJsonFile.json a ./myJsonFile.js, no se debe cambiar nada en la importación.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.