Leer y escribir archivos JSON con Node.js

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *