Desarrollo

Cómo formatear JSON minificado para poder leerlo de verdad

Volver a indentar una línea enorme es la parte fácil. La vuelta por el parser es donde las cosas cambian sin avisar.

El JSON minificado llega en una sola línea porque el espacio en blanco entre tokens no significa nada en JSON. Para leerlo, pásalo otra vez por un parser e imprímelo de nuevo con indentación: pega la línea en el formateador de JSON, deja la indentación de dos espacios y vuelve como un árbol. El espacio en blanco nunca es el riesgo: agregarlo o quitarlo no puede cambiar ni un solo valor. Lo que cambia las cosas es la vuelta por el parser, y uno de esos cambios pierde datos sin avisar.

Por qué llegó en una sola línea

La RFC 8259 nombra exactamente cuatro caracteres como espacio en blanco insignificante entre tokens: espacio, tabulación, salto de línea y retorno de carro. Insignificante quiere decir que el parser los salta sin mirarlos. Minificar un documento JSON no es más que borrar todos los que estén fuera de una string: el espacio dentro de una string es dato y se queda exactamente donde está.

La razón por la que alguien se toma la molestia es que la indentación ocupa una parte real de un archivo formateado. A dos espacios por nivel, una línea anidada cuatro niveles adentro carga ocho espacios iniciales más un salto de línea: nueve bytes de nada. Un archivo de 5.000 líneas cuyas líneas promedian esa profundidad arrastra 45 kB de layout antes del primer carácter de datos.

En la red importa menos de lo que sugiere esa aritmética. Cualquier cosa que sirva JSON con sensatez lo manda con gzip o brotli, y las secuencias largas de espacios idénticos son el patrón más fácil que un compresor va a encontrar en su vida. Minificar sigue ganando, solo que por un margen más chico del que insinúa el conteo de bytes.

Cómo formatearlo

Cuatro lugares, según dónde esté ya el texto.

Qué cambia la vuelta por el parser

Un formateador no espolvorea saltos de línea sobre tu texto. Parsea el documento hasta convertirlo en un valor e imprime ese valor otra vez desde cero. Todo lo que no era parte de los datos no sale del otro lado.

El cambio que sí pierde datos

Los enteros grandes. La especificación de JSON no pone límite al tamaño ni a la precisión de un número, pero JavaScript guarda todos los números como float de 64 bits, así que los enteros por encima de 9.007.199.254.740.991 no se pueden representar todos con exactitud. Dale a un parser de JavaScript 9007199254740993 y te devuelve 9007199254740992 sin un error en ninguna parte.

Esto cae primero sobre los identificadores: IDs de base de datos, snowflakes de Discord, timestamps en nanosegundos. Por eso las APIs bien hechas mandan los IDs grandes como strings. El formateador de este sitio busca literales enteros que cambian cuando JavaScript los lee y te dice cuáles son, pero no puede repararlos: para cuando el valor existe, los dígitos ya se perdieron. Si ves esa advertencia, trata la salida formateada como insegura para volver a pegarla en cualquier cosa que importe.

Por qué el error dice línea 1, columna 4812

Esta es la manera específica en que el JSON minificado te arruina el día. Está todo en una sola línea, así que el parser informa un número de columna en los miles y no tienes dónde mirar. No puedes formatear el archivo para encontrar el problema, porque el problema es justamente la razón por la que no se formatea.

Dos salidas. Pega la línea en un editor y usa su cuadro de ir a una posición: el de VS Code acepta line:column, así que escribir 1:4812 deja el cursor sobre el carácter en cuestión. O sáltate eso y recorre la lista de cosas que suelen estar mal, porque la lista es corta:

Diga lo que diga la posición, recuerda que es donde el parser se dio por vencido, no donde te equivocaste. Una coma faltante se informa al comienzo de la clave siguiente, y una string sin cerrar se informa en la comilla que venga después. Mira un poco antes del número que te dieron.

Algunos archivos son casi JSON en vez de estar rotos. JSON5 y JSONC permiten comentarios y comas sobrantes, y van a fallar en cualquier formateador estricto, incluido el nuestro. NDJSON —un objeto por línea, sin array que lo envuelva— también falla, porque la segunda línea es entrada inesperada; envuelve tú mismo las líneas en un array primero. Si lo que querías en realidad era un formato de configuración que te deje escribir comentarios, la disyuntiva entre YAML y JSON es la versión honesta de esa pregunta.

Cómo leerlo una vez indentado

La indentación por sí sola no vuelve comprensible un objeto de 4.000 líneas. Dos cosas ayudan antes de que empieces a desplazarte.

La primera es la forma. La profundidad de anidamiento y la cantidad de claves te dicen qué problema tienes: un payload de cinco niveles con cuarenta claves se lee muy distinto de uno de dos niveles con cuatro mil. El formateador imprime la profundidad y la cantidad de claves arriba de la salida, que es la forma más barata de averiguar cuál de los dos tienes antes de ponerte a desplazarte.

La segunda es el ordenamiento. Ordenar las claves alfabéticamente hace que un objeto desconocido se pueda buscar, y es seguro por definición, porque los miembros de un objeto no tienen orden. También es destructivo de una manera que importa en los archivos que la gente mantiene: la agrupación del autor casi siempre significaba algo. Ordena una respuesta que estés inspeccionando, no un archivo de configuración que estás por commitear.

El ordenamiento se gana el sueldo cuando comparas dos payloads. Formatea los dos con las claves ordenadas y después pásalos por un diff línea por línea: sin ordenar, obtienes un diff lleno de líneas que solo se movieron, y el único campo que de verdad cambió queda enterrado ahí.

Y si el JSON resulta ser un array plano de objetos —una lista de filas con las mismas claves—, la indentación es la vista completamente equivocada. Trescientos registros son ilegibles como árbol y obvios como tabla, que es para lo que sirve convertir JSON a CSV, junto con los campos que se pierden cuando lo haces.

Dónde aparece una y otra vez el JSON minificado

Las respuestas de API son la fuente obvia, pero no la única. Cualquier cosa escrita en localStorage o en un atributo data- pasó por JSON.stringify, que no agrega espacio en blanco salvo que se lo pidas. Las líneas de log estructurado se minifican para que un evento quede en una sola línea. Y el segmento del medio de un JWT es JSON minificado codificado en base64url, y por eso decodificar un token te entrega un muro de texto: recuperas el JSON, todavía en una sola línea, y todavía tienes que indentarlo.

Todos ellos hacen bien en quedarse minificados donde viven. La idea no es ordenar el origen: es tener una copia legible delante durante los dos minutos que la necesitas, y después tirarla.

El formateador de JSON de este sitio hace el ciclo entero en un solo lugar: indenta o minifica, señala la línea y la columna cuando la entrada no parsea, y te avisa de las claves duplicadas y los enteros demasiado grandes que parsean sin problema y te cuestan una tarde igual. Corre en tu pestaña, así que el payload que estás depurando no se sube a ningún lado.

Si el texto que intentas leer salió de un token y no de una API, qué hay realmente dentro de un JWT cubre el paso de decodificación que viene primero y, más útil todavía, por qué leer los claims no prueba nada sobre si son verdaderos.

Preguntas frecuentes

¿Cómo formateo JSON minificado?

Pásalo por un parser que imprima el valor otra vez con indentación. Un formateador en el navegador, el comando Format Document de VS Code, o las herramientas de línea de comandos "python -m json.tool" y "jq ." lo hacen todas. El espacio en blanco entre tokens no significa nada en JSON, así que la indentación en sí no cambia nada, aunque la vuelta por el parser sí puede normalizar números y descartar claves duplicadas.

¿Hay alguna diferencia entre JSON minificado y JSON formateado?

Para un parser, no. El espacio, la tabulación, el salto de línea y el retorno de carro entre tokens son insignificantes, así que las dos formas describen el mismo valor. Las únicas diferencias son el tamaño del archivo y si una persona puede leerlo.

¿Por qué mi error de JSON dice línea 1 con un número de columna enorme?

Porque el documento entero está en una sola línea, así que el parser solo puede informar cuántos caracteres recorrió antes de detenerse. Pega el texto en un editor y usa su cuadro de ir a una posición, que en VS Code acepta un par line:column. Mira también un poco antes de la posición informada, porque un parser solo falla cuando llega a algo que no puede venir a continuación.

¿Formatear JSON cambia los datos?

El espacio en blanco en sí no, pero la vuelta por el parser sí puede. Los números se normalizan, así que 1.0 se convierte en 1, los escapes como \u0041 se convierten en los caracteres que representan, y las claves duplicadas se colapsan en la última. Por encima de 9.007.199.254.740.991 los enteros ya no se pueden guardar todos con exactitud, así que algunos vuelven redondeados en cualquier herramienta basada en JavaScript.

¿Puedo formatear JSON que tiene comentarios?

No, porque un archivo con comentarios no es JSON. Los comentarios lo convierten en JSONC o JSON5, y un parser estricto los rechaza junto con las comas sobrantes y las strings entre comillas simples. Quita primero los comentarios, o usa una herramienta hecha para el formato que tu cargador de configuración espera de verdad.

¿Es seguro pegar JSON en un formateador online?

Depende enteramente de si la página sube tu texto. Muchos formateadores lo mandan a un servidor, lo cual es un problema cuando el payload contiene datos de clientes o un token de acceso. Las herramientas que parsean en el navegador no transmiten nada, así que el contenido se queda en tu máquina.

Última actualización 19 de septiembre de 2026