Una de las mejores formas de intercambiar información entre aplicaciones escritas en diferentes idiomas es utilizar el JSON (Notación de objetos JavaScript). Gracias a su uniformidad y simplicidad, JSON ha reemplazado casi por completo a XML como formato estándar de intercambio de datos en software, particularmente en servicios web.
Dado el amplio uso de JSON en aplicaciones de software, y especialmente en aplicaciones basadas en JavaScript, es importante saber cómo leer y escribir datos JSON en un archivo en Node.js. En este artículo explicaremos cómo realizar estas funciones.
Leer un archivo JSON
Contenido
Primero veamos cómo podemos leer un archivo que ya ha sido creado. Pero antes de hacer eso, necesitamos crear el archivo. Abra una nueva ventana en su editor de texto favorito y agregue el siguiente texto:
{
"name": "Sara",
"age": 23,
"gender": "Female",
"department": "History",
"car": "Honda"
}
Ahora guarde este archivo como «student.json» en el directorio de su proyecto.
Para leer los datos JSON del archivo podemos usar Node.js fs módulo. Hay dos funciones disponibles en este módulo que podemos usar para leer archivos del sistema de archivos: readFile
y readFileSync
.
Aunque ambas funciones realizan tareas similares, es decir, leer archivos del disco, la diferencia radica en la forma en que estas funciones se ejecutan realmente, que explicaremos con más detalle en las secciones siguientes.
Te puede interesar:Escribir en archivos en Node.jsUsando fs.readFileSync
los readFileSync
La función lee datos de un archivo de forma síncrona. Esta función bloquea la ejecución del resto del código hasta que se leen todos los datos de un archivo. La función es particularmente útil cuando su aplicación tiene que cargar ajustes de configuración antes de poder realizar cualquier otra tarea.
Para continuar con nuestro ejemplo, usemos esta función para leer el archivo «student.json» que creamos anteriormente, usando el readFileSync
función. Agregue el siguiente código a un archivo ‘.js’:
'use strict';
const fs = require('fs');
let rawdata = fs.readFileSync('student.json');
let student = JSON.parse(rawdata);
console.log(student);
En el código de Node.js anterior, primero cargamos el fs
módulo a nuestra aplicación. A continuación usamos el readFileSync
función y pasarle la ruta de archivo relativa al archivo que queremos leer. Si imprime el objeto rawdata
a la consola, verá datos sin procesar (en un Buffer) en la pantalla de la consola:
<Buffer 7b 20 0a 20 20 20 20 22 6e 61 6d 65 22 3a 20 22 53 61 72 61 22 2c 0a 20 20 20 20 22 61 67 65 22 3a 20 32 33 2c 0a 20 20 20 20 22 67 65 6e 64 65 72 22 ... >
Sin embargo, queremos leer el archivo en su formato JSON, no los datos hexadecimales sin procesar. Aquí es donde el JSON.parse
la función entra en juego. Esta función maneja el análisis de los datos sin procesar, los convierte en texto ASCII y analiza los datos JSON reales en un objeto JavaScript. Ahora, si imprime el student
objeto en la consola, obtendrá el siguiente resultado:
{ name: 'Sara',
age: 23,
gender: 'Female',
department: 'History',
car: 'Honda' }
Como puede ver, el JSON de nuestro archivo se cargó correctamente en el student
objeto.
Usando fs.readFile
Otra forma de leer un archivo JSON en Node.js es usando el readFile
función. diferente a readFileSync
función, la readFile
La función lee los datos del archivo de forma asincrónica. Cuando un readFile
se llama a la función, el proceso de lectura del archivo comienza e inmediatamente el control cambia a la siguiente línea ejecutando las líneas restantes de código. Una vez que se han cargado los datos del archivo, esta función llamará a la función de devolución de llamada que se le proporcionó. De esta manera, no está bloqueando la ejecución del código mientras espera que el sistema operativo se comunique con usted con los datos.
En nuestro ejemplo, el readFile
La función toma dos parámetros: la ruta al archivo que se leerá y la función de devolución de llamada que se llamará cuando el archivo se lea por completo. Opcionalmente, también puede incluir un parámetro con opciones, pero no las cubriremos en este artículo.
Eche un vistazo al siguiente ejemplo para comprender cómo utilizar readFile
función.
'use strict';
const fs = require('fs');
fs.readFile('student.json', (err, data) => {
if (err) throw err;
let student = JSON.parse(data);
console.log(student);
});
console.log('This is after the read call');
El código anterior hace exactamente lo que hizo nuestro fragmento de código anterior (con un extra console.log
call), pero lo hace de forma asincrónica. Estas son algunas de las diferencias que quizás haya notado:
(err, data) => {}
: Esta es nuestra función de devolución de llamada que se ejecuta una vez que el archivo se lee por completoerr
: Dado que no podemos usar try / catch fácilmente con código asincrónico, la función nos da unaerr
objeto si algo sale mal. Esnull
si no hubo errores
También puede haber notado que imprimimos una cadena en la consola inmediatamente después de llamar readFile
. Esto es para mostrarle el comportamiento del código asincrónico. Cuando se ejecuta el script anterior, verá que este console.log
se ejecuta antes del readFile
Se ejecuta la función de devolución de llamada. Esto es porque readFile
no bloquea la ejecución del código mientras lee datos del sistema de archivos.
La salida del código se verá así:
This is after the read call
{ name: 'Sara',
age: 23,
gender: 'Female',
department: 'History',
car: 'Honda' }
Como puede ver, la última línea de código en nuestro archivo es en realidad la que aparece primero en la salida.
Te puede interesar:Cómo corregir: «ADVERTENCIA: LA IDENTIFICACIÓN DEL HOST REMOTO HA CAMBIADO» en Mac y LinuxUtilizando require
Otro enfoque es utilizar el require
método para leer y analizar archivos JSON. Este es el mismo método que usa para cargar módulos Node, pero también se puede usar para cargar JSON.
Eche un vistazo al siguiente ejemplo.
'use strict';
let jsonData = require('./student.json');
console.log(jsonData);
Funciona exactamente como el readFileSync
código que mostramos anteriormente, pero es un método disponible globalmente que puede usar en cualquier lugar, lo que tiene sus ventajas.
Sin embargo, hay algunos inconvenientes de require
función:
- Require es una función sincrónica y se llama solo una vez, lo que significa que las llamadas reciben un resultado en caché. Si el archivo está actualizado, no puede volver a leerlo con este método.
- Su archivo debe tener la extensión ‘.json’, por lo que no puede ser tan flexible. Sin la extensión adecuada
require
no trata el archivo como un archivo JSON.
Escribir JSON en un archivo
Similar a readFile
y readFileSync
funciones, hay dos funciones para escribir datos en archivos: writeFile
y writeFileSync
. Como sugieren los nombres, el writeFile
El método escribe datos en un archivo de forma asincrónica mientras writeFileSync
La función escribe datos en un archivo de manera síncrona.
Veremos más de cerca en las siguientes secciones.
Te puede interesar:Cómo Docker puede facilitarle la vida como desarrolladorUsando fs.writeFileSync
los writeFileSync
La función acepta 2-3 parámetros: la ruta del archivo para escribir datos, los datos para escribir y un parámetro opcional.
Tenga en cuenta que si el archivo aún no existe, se crea un nuevo archivo para usted. Eche un vistazo al siguiente ejemplo:
'use strict';
const fs = require('fs');
let student = {
name: 'Mike',
age: 23,
gender: 'Male',
department: 'English',
car: 'Honda'
};
let data = JSON.stringify(student);
fs.writeFileSync('student-2.json', data);
En el ejemplo anterior, estamos almacenando nuestro objeto JSON student
a un archivo llamado «student-2.json». Tenga en cuenta que aquí tenemos que utilizar el JSON.stringify
función antes de guardar los datos. Al igual que necesitábamos analizar los datos en formato JSON cuando leemos el archivo JSON, necesitamos «secuenciar» los datos antes de poder almacenarlos en forma de cadena en el archivo.
Ejecute el código anterior y abra el archivo «student-2.json». Debería ver el siguiente contenido en el archivo:
{"name":"Mike","age":23,"gender":"Male","department":"English","car":"Honda"}
Aunque estos son los datos que queríamos escribir, los datos están en forma de una línea de cadena, lo cual es difícil de leer para nosotros. Si desea que el JSON serializado sea legible por humanos, cambie el JSON.Stringify
funcionan de la siguiente manera:
let data = JSON.stringify(student, null, 2);
Aquí le decimos al método que agregue nuevas líneas y un par de sangrías al JSON serializado. Ahora, si abre el archivo «student-2.json», debería ver el texto en el siguiente formato.
Te puede interesar:Usar variables globales en Node.js{
"name": "Mike",
"age": 23,
"gender": "Male",
"department": "English",
"car": "Honda"
}
Usando fs.writeFile
Como mencioné anteriormente, el writeFile
La función se ejecuta de manera asincrónica, lo que significa que nuestro código no se bloquea mientras se escriben datos en el archivo. Y al igual que los métodos asincrónicos de antes, necesitamos pasar una devolución de llamada a esta función.
Escribamos otro archivo, «student-3.json», usando el writeFile
función.
'use strict';
const fs = require('fs');
let student = {
name: 'Mike',
age: 23,
gender: 'Male',
department: 'English',
car: 'Honda'
};
let data = JSON.stringify(student, null, 2);
fs.writeFile('student-3.json', data, (err) => {
if (err) throw err;
console.log('Data written to file');
});
console.log('This is after the write call');
La salida del script anterior será:
This is after the write call
Data written to file
Y nuevamente, puede ver que la última línea de nuestro código en realidad aparece primero en la consola ya que aún no se ha llamado a nuestra devolución de llamada. Esto termina ahorrando bastante tiempo de ejecución si tiene grandes cantidades de datos para escribir en su archivo, o si tiene bastantes archivos para escribir.
Aprende más
¿Quiere obtener más información sobre los fundamentos de Node.js? Personalmente, recomendaría tomar un curso en línea como Aprenda Node.js de Wes Bos. No solo aprenderá la sintaxis de ES2017 más actualizada, sino que también podrá crear una aplicación de restaurante completa. En mi experiencia, crear aplicaciones del mundo real como esta es la forma más rápida de aprender.
Conclusión
A lo largo de este artículo, mostramos cómo puede leer y escribir datos JSON desde y hacia archivos, que es una tarea muy común e importante que debe saber hacer como programador web.
Te puede interesar:Entrar en el universo de Linux como novatoHay un par de métodos en el fs
módulo tanto para leer y escribir en archivos JSON. los readFile
y readFileSync
Las funciones leerán datos JSON del archivo de forma asíncrona y síncrona, respectivamente. También puede utilizar el global require
método para manejar la lectura / análisis de datos JSON de un archivo en una sola línea de código. Sin embargo, require
es sincrónico y solo puede leer datos JSON de archivos con la extensión ‘.json’.
Del mismo modo, el writeFile
y writeFileSync
funciones de la fs
El módulo escribe datos JSON en el archivo de forma asíncrona y síncrona respectivamente.