Leer y escribir archivos JSON con Node.js

L

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

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.

Usando 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 completo
  • err: Dado que no podemos usar try / catch fácilmente con código asincrónico, la función nos da una err objeto si algo sale mal. Es null 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.

Utilizando 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.

Usando 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.

{
  "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.

Hay 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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad