Estructura de JSON.
JSON (JavaScript Object Notation) es el formato de intercambio de datos más usado en la web. Es simple: objetos con llaves y valores, arrays, strings, números, booleanos y null. Su simplicidad es su ventaja y también su trampa: un solo carácter mal puesto rompe todo el documento.
Las reglas que más desarrolladores olvidan: las llaves de objetos siempre van entre comillas dobles (no simples), no se permiten comas al final del último elemento, y los comentarios no existen en JSON estándar.
Errores comunes.
Los errores de JSON más frecuentes en el trabajo real:
- Trailing comma:
{"name": "Juan",}— la coma después del último elemento es inválida en JSON. - Comillas simples:
{'name': 'Juan'}— JSON solo acepta comillas dobles. - undefined:
{"value": undefined}— undefined no existe en JSON. Usá null. - NaN e Infinity: No son valores JSON válidos. Hay que convertirlos antes de serializar.
- Caracteres sin escapar: Comillas, barras invertidas y ciertos caracteres de control dentro de strings necesitan escape.
// Esto rompe JSON.stringify de forma silenciosa:
JSON.stringify({ fn: () => {}, sym: Symbol('x'), undef: undefined });
// Resultado: {} — los tres campos desaparecen
// Para detectarlo:
const data = { name: 'Juan', callback: () => {} };
const safe = JSON.parse(JSON.stringify(data));
// safe = { name: 'Juan' } — callback silenciosamente eliminado
Validación con schemas.
Parsear JSON sin validar es un riesgo de seguridad y estabilidad. Si una API externa o un usuario puede enviar JSON arbitrario, necesitás validar la estructura antes de usarla. Zod es la librería más elegante para esto en TypeScript:
import { z } from 'zod';
const ArticleSchema = z.object({
title: z.string().min(1).max(200),
content: z.string(),
tags: z.array(z.string()).max(10).optional(),
publishedAt: z.string().datetime().optional(),
});
function parseArticle(raw: unknown) {
const result = ArticleSchema.safeParse(raw);
if (!result.success) {
throw new Error(`JSON inválido: ${result.error.message}`);
}
return result.data; // tipado correctamente
}
Formateo y limpieza.
Para debugging y logging, JSON.stringify acepta parámetros opcionales para formatear la salida:
// Indentación con 2 espacios
console.log(JSON.stringify(data, null, 2));
// Filtrar solo ciertas llaves
console.log(JSON.stringify(data, ['id', 'name', 'email'], 2));
// Transformar valores al serializar
JSON.stringify(data, (key, value) => {
if (key === 'password') return '[REDACTED]';
if (value instanceof Date) return value.toISOString();
return value;
});
Herramientas útiles.
Para el trabajo diario: la herramienta JSON del mismo GaloDev, jq en la terminal para transformar JSON desde scripts, Insomnia o Bruno para probar APIs con JSON, y la extensión JSON Viewer en el browser para formatear automáticamente respuestas de APIs.