JSON es el formato estándar para intercambiar datos en la web, pero su paso por JavaScript introduce cambios silenciosos que pueden alterar el significado de la información sin que el código lance ningún error. Este artículo analiza las principales trampas que aparecen al serializar y deserializar objetos en JavaScript y propone convenciones para definir contratos de datos explícitos en los límites de cada aplicación.
La primera trampa afecta a los números. JavaScript utiliza el formato IEEE 754 de doble precisión, capaz de representar enteros exactos solo entre -(2^53 - 1) y 2^53 - 1. Un identificador como 9007199254740993 se redondea a 9007199254740992 durante la evaluación del literal, antes incluso de que JSON.stringify intervenga. La pérdida de precisión afecta a identificadores de base de datos, números de cuenta, totales de facturas y valores monetarios en unidades menores. JSON no impone un tipo numérico único, por lo que un sistema con enteros más amplios puede generar JSON válido que JavaScript no podrá almacenar con exactitud. Para preservar valores grandes, la solución habitual es acordar una representación como cadena decimal y declararla en el esquema.
La segunda trampa es la pérdida de información sobre propiedades presentes con valor undefined. En JavaScript, una propiedad con valor undefined se distingue de una propiedad ausente, pero JSON.stringify omite ambas en los objetos, de modo que ambas situaciones producen idéntico JSON. Esto rompe actualizaciones parciales, superposiciones de configuración y estados en caché pensados para distinguir entre omitir un campo y limpiarlo. Los arrays, en cambio, convierten esos valores en null para mantener la posición de los elementos.
El artículo también aborda los objetos Date, que se serializan como cadenas ISO 8601 y dejan de ser objetos Date al deserializarse, y los valores NaN, que se convierten en null. Propone tratar los límites de serialización como un contrato de datos explícito, definiendo en el esquema cómo deben representarse los identificadores, las fechas y los opcionales, en lugar de asumir que JSON preservará la estructura original.
