Introducción a JSON y su rol en JavaScript
JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos, basado en la sintaxis de objetos de JavaScript. A pesar de su origen, JSON se ha convertido en un estándar universal para la transmisión de datos estructurados entre el servidor y el cliente, así como para el almacenamiento de configuraciones y el intercambio de información en arquitecturas de microservicios.
En el entorno de Node.js, trabajar con JSON es una tarea cotidiana: desde la lectura de archivos de configuración hasta el procesamiento de respuestas de REST API. En este artículo, analizaremos en detalle dos métodos clave — JSON.parse() y JSON.stringify(), así como los errores típicos y las mejores prácticas.
1. Análisis de JSON: método JSON.parse()
El método JSON.parse() convierte una cadena en formato JSON en un objeto de JavaScript. Esto es necesario cuando recibes datos del servidor, de un archivo o de una fuente externa.
Sintaxis básica
const jsonString = '{"name": "Ana", "age": 30, "isStudent": false}';const user = JSON.parse(jsonString);console.log(user.name); // "Ana"console.log(user.age); // 30Uso avanzado: función reviver
El segundo argumento de JSON.parse() puede ser una función transformadora (reviver), que permite modificar los valores durante el análisis. Esto es útil para convertir fechas en formato string a objetos Date o para la validación de datos.
const jsonData = '{"date": "2024-01-15T10:30:00.000Z", "value": 42}';const parsed = JSON.parse(jsonData, (key, value) => { if (key === 'date') { return new Date(value); } return value;});console.log(parsed.date instanceof Date); // trueconsole.log(parsed.date.toLocaleDateString()); // "15/01/2024"Manejo de errores de análisis
Un JSON incorrecto provocará una excepción SyntaxError. Siempre envuelve la llamada a JSON.parse() en un bloque try...catch:
function safeParse(jsonString) { try { return { data: JSON.parse(jsonString), error: null }; } catch (error) { console.error('Error de análisis JSON:', error.message); return { data: null, error: error.message }; }}
const result = safeParse('{"name": "Error"}');console.log(result.data.name); // "Error"2. Serialización a JSON: método JSON.stringify()
El método JSON.stringify() realiza la tarea inversa: convierte un objeto de JavaScript en una cadena JSON. Esto se utiliza al enviar datos al servidor, guardar el estado o registrar información.
Sintaxis básica
const user = { name: 'Iván', age: 25, skills: ['JavaScript', 'Node.js']};
const jsonString = JSON.stringify(user);console.log(jsonString);// {"name":"Iván","age":25,"skills":["JavaScript","Node.js"]}Parámetros de formato
El tercer argumento de JSON.stringify() permite establecer sangrías para una salida legible. Esto es especialmente útil al escribir en archivos o durante la depuración.
const config = { server: { port: 3000, host: 'localhost' }, database: { host: 'db.example.com', port: 5432 }};
// Salida compactaconsole.log(JSON.stringify(config));
// Salida legible con sangría de 2 espaciosconsole.log(JSON.stringify(config, null, 2));// {// "server": {// "port": 3000,// "host": "localhost"// },// ...// }Filtrado de propiedades con replacer
El segundo argumento es un array o una función que determina qué propiedades incluir en la cadena resultante.
const user = { id: 1, name: 'María', email: 'maria@example.com', password: 'secret123', role: 'admin'};
// Excluimos datos confidencialesconst safeUser = JSON.stringify(user, ['id', 'name', 'email', 'role']);console.log(safeUser);// {"id":1,"name":"María","email":"maria@example.com","role":"admin"}