Funciones Replacer y Reviver
Aprende a transformar y filtrar datos durante la serialización con replacer y la deserialización con reviver para un control total sobre JSON.
TL;DR - Resumen rápido
- El replacer en stringify filtra o transforma propiedades antes de serializar
- El reviver en parse transforma valores después de deserializar
- Ambos se ejecutan recursivamente para cada propiedad del objeto
- Retornar undefined en replacer/reviver omite la propiedad
- Combinar ambos permite serialización y deserialización personalizadas
Introducción a Replacer y Reviver
Las funciones replacer y reviver son herramientas poderosas que te dan control total sobre cómo se serializan y deserializan los datos JSON. El replacer se ejecuta durante JSON.stringify() permitiendo filtrar, transformar o modificar valores antes de convertirlos a string. El reviver se ejecuta durante JSON.parse() permitiendo restaurar tipos de datos personalizados o validar valores después del parsing.
Estas funciones son especialmente útiles cuando trabajas con tipos de datos que JSON no soporta nativamente, como Date, Map, Set, o tipos personalizados. También son esenciales para implementar seguridad (excluyendo datos sensibles) y validación (asegurando que los datos cumplan ciertos criterios antes de usarlos).
- Filtrado de propiedades sensibles durante serialización
- Transformación de tipos de datos personalizados
- Validación y sanitización de datos al deserializar
- Restauración de objetos Date desde strings ISO 8601
- Implementación de versioning de esquemas de datos
Diferencia clave: Momento de ejecución
El replacer se ejecuta ANTES de convertir a string (durante stringify), mientras que el reviver se ejecuta DESPUÉS de convertir desde string (durante parse). Esto significa que el replacer trabaja con objetos JavaScript reales, mientras que el reviver trabaja con valores ya parseados desde JSON.
Replacer en JSON.stringify()
El parámetro replacer de JSON.stringify() puede ser un array o una función. Cuando es un array, especifica qué propiedades incluir en el JSON resultante. Cuando es una función, se llama para cada propiedad del objeto, permitiendo filtrar, transformar o modificar valores dinámicamente. La función recibe dos argumentos: la clave y el valor.
El ejemplo muestra cómo el replacer filtra propiedades sensibles como password y _interno antes de serializar el objeto. La función verifica si la clave coincide con propiedades que deben ser excluidas y retorna undefined para omitirlas. Este patrón es fundamental para seguridad, asegurando que datos sensibles nunca se serialicen en JSON.
Transformación de Tipos con Replacer
El replacer no solo puede filtrar propiedades, sino también transformar valores a diferentes tipos. Esto es útil para convertir objetos complejos a representaciones más simples, calcular valores derivados, o normalizar formatos de datos antes de serializar.
El ejemplo demuestra cómo el replacer transforma objetos Date a timestamps, calcula el total de un array de productos, y convierte objetos Map a arrays de pares clave-valor. Este enfoque permite serializar estructuras de datos complejas que JSON no soporta nativamente, convirtiéndolas a representaciones JSON válidas.
Reviver en JSON.parse()
El parámetro reviver de JSON.parse() es una función que se ejecuta para cada propiedad del objeto parsed. Esta función permite transformar valores después de que han sido convertidos desde JSON, restaurando tipos de datos personalizados o validando datos antes de usarlos. La función recibe los mismos dos argumentos que el replacer: clave y valor.
El ejemplo muestra cómo el reviver detecta strings en formato ISO 8601 y los convierte a objetos Date. Este patrón es esencial porque JSON no tiene un tipo de fecha nativo, por lo que las fechas se serializan como strings. El reviver las restaura automáticamente, permitiéndote usar métodos de Date en lugar de manipular strings de fecha manualmente.
Mejor práctica: Combinar replacer y reviver
Para tipos personalizados, usa el replacer para convertirlos a JSON y el reviver para restaurarlos. Por ejemplo, Date → timestamp → Date. Esto crea un ciclo completo de serialización/deserialización que mantiene la integridad de tus tipos de datos.
Validación y Sanitización con Reviver
Además de restaurar tipos de datos, el reviver puede validar y sanitizar valores durante el parsing. Esto es útil para asegurar que los datos cumplan ciertos criterios antes de ser usados en tu aplicación, previniendo errores o vulnerabilidades de seguridad.
El ejemplo demuestra un reviver que valida y sanitiza datos de usuario. Los emails se convierten a minúsculas, los nombres se capitalizan, y se validan rangos de edad. Este enfoque centraliza la lógica de validación en un solo lugar, aplicándola automáticamente cada vez que se parsean datos JSON de fuentes externas.
Patrones Avanzados
Combinar replacer y reviver permite implementar patrones avanzados de serialización y deserialización. Los casos de uso más comunes en producción incluyen:
- <strong>Tipos personalizados</strong>: Serializar/deserializar Date, Map, Set con fidelidad completa
- <strong>Referencias circulares</strong>: Detectar y manejar objetos que se referencian mutuamente
- <strong>Versioning de esquemas</strong>: Migrar datos legacy automáticamente al formato actual
- <strong>Seguridad y filtrado</strong>: Excluir datos sensibles durante serialización consistentemente
El ejemplo muestra un ciclo completo de serialización y deserialización usando replacer y reviver. El replacer convierte Date a timestamp, Map a array, y filtra propiedades privadas. El reviver restaura Date desde timestamp, reconstruye Map desde array, y aplica valores por defecto. Este patrón asegura que los datos mantengan su estructura original después de pasar por JSON.
Advertencia: Referencias circulares
El replacer no resuelve automáticamente referencias circulares. Si necesitas serializar objetos con referencias circulares, implementa un replacer que detecte y maneje estas referencias, por ejemplo usando WeakMap para rastrear objetos ya visitados.
Versioning de Esquemas
Los replacer y reviver son herramientas poderosas para implementar versioning de esquemas de datos. Puedes incluir una propiedad de versión en tu JSON y usar el reviver para transformar datos de versiones anteriores al formato actual, permitiendo migración automática de datos legacy.
El ejemplo muestra cómo implementar versioning de esquemas usando replacer y reviver. El replacer agrega una propiedad _version para identificar el formato de los datos. El reviver detecta la versión y transforma datos de versiones anteriores al formato actual. Este patrón permite evolucionar tu esquema de datos sin romper compatibilidad con datos almacenados.
Resumen: Replacer y Reviver
Conceptos principales:
- •Replacer filtra/transforma durante JSON.stringify()
- •Reviver transforma durante JSON.parse()
- •Ambos se ejecutan recursivamente para cada propiedad
- •Retornar undefined omite la propiedad del resultado
- •Combinar ambos permite serialización personalizada completa
Mejores prácticas:
- •Usa replacer para excluir datos sensibles al serializar
- •Usa reviver para restaurar tipos como Date desde strings
- •Valida y sanitiza datos en el reviver para seguridad
- •Implementa versioning de esquemas con ambos parámetros
- •Documenta claramente las transformaciones aplicadas