Indentar JSON
Esta herramienta da formato al JSON con sangría y saltos de línea para que una persona pueda leerlo. Pega un documento abajo para hacerlo aquí, o llévate la línea que lo hace en tu propio lenguaje — JavaScript, Python, Go, Java, C#, PHP, Ruby, Rust, jq o PowerShell —, cada una con el valor por defecto que despista, porque todas estas APIs tienen uno.
Integrado. Sin dependencias, disponible en el navegador y en Node.
¿Cómo funciona Indentar JSON?
Dar formato bonito a JSON significa una cosa: analizar el documento y volverlo a escribir con un salto de línea después de cada coma y un nivel de sangría por cada nivel de anidamiento. Los bytes son equivalentes — un parser no puede distinguir uno del otro —, pero uno se lee y el otro es un muro.
Dos preguntas distintas, una página
Quien busca esto quiere una de dos cosas: o un cuadro donde pegar una carga, que es el panel de arriba; o la línea de código que lo hace dentro del programa que está escribiendo, que es el selector de abajo. Esta página responde a ambas, porque mandar a alguien a un artilugio de formato cuando necesitaba json.dumps(obj, indent=2) es un clic desperdiciado.
Todos los lenguajes tienen un valor por defecto que sorprende a alguien
Esta es la parte que vale la pena conocer, y es la razón de que las recetas de aquí lleven cada una su nota en lugar de ser una lista de una sola línea. Python escapa todos los caracteres no ASCII a menos que pases ensure_ascii=False, así que café llega como caf\u00e9. Go escapa <, > y & porque la salida alguna vez pudo acabar dentro de una etiqueta <script>. PHP escapa las barras inclinadas, así que cada URL de tu salida parece rota. ConvertTo-Json de PowerShell trunca todo lo anidado a más de dos niveles de profundidad y no te avisa — simplemente sustituye el resto por un nombre de tipo y sigue.
Y en JavaScript, el error está en la propia llamada: JSON.stringify(value, 2) parece correcta, compila, se ejecuta y devuelve la cadena minificada, porque el segundo argumento es la función reemplazadora y el tercero es la sangría.
Ordenar las claves es una decisión aparte
Ordenar las claves alfabéticamente hace que dos versiones del mismo documento se puedan comparar, que es toda la razón para hacerlo — sin eso, un serializador que emite las claves en orden de inserción produce un diff lleno de movimientos. Aquí está desactivado por defecto porque cambia el orden del documento, y en un archivo de configuración o un lockfile ese orden a veces lleva significado.
La sangría, y qué elegir
Dos espacios es la convención de la web y de JavaScript, y mantiene en pantalla los documentos profundamente anidados. Cuatro es la norma en Python y en gran parte del mundo del backend. Las tabulaciones permiten que cada lector elija su propio ancho, que es su argumento más fuerte y la razón por la que algunos proyectos las exigen. Ninguna de las tres es más correcta que las otras; la única respuesta equivocada es mezclarlas dentro de un mismo archivo.
Esto no cambia lo que significan los datos
El espacio en blanco entre tokens no es significativo en JSON, así que dar formato bonito es reversible y sin pérdidas — pasa la salida por un minificador y recuperas la entrada, byte a byte, salvo que también hayas ordenado las claves. Lo que sí cambia es el tamaño: la sangría puede añadir 20–40% a un documento, algo que importa en tránsito y que no importa en absoluto en un registro que estás leyendo.
Si el documento no se analiza, nada de lo que hay aquí puede darle formato, y el error de abajo nombra la línea y la columna. «Validar JSON» también ofrecerá reparar las causas habituales — una coma final, una comilla simple, una clave sin comillas.
No se sube nada
El archivo se procesa en esta pestaña. La página puede descargar las bibliotecas o los modelos necesarios; esta operación no sube el archivo.
Minificado
{"id":42,"tags":["prod","payment"],"ok":true}Con formato bonito
{
"id": 42,
"tags": [
"prod",
"payment"
],
"ok": true
}¿Qué opciones y casos límite admite Indentar JSON?
| Parámetro | Tipo | Valor predeterminado | Comportamiento y casos límite |
|---|---|---|---|
| JavaScript | JSON.stringify | integrado | JSON.stringify(valor, null, 2). El segundo argumento es el reemplazador — pasar 2 allí no hace nada. |
| Python | json.dumps | biblioteca estándar | json.dumps(obj, indent=2). Añade ensure_ascii=False o cada carácter no ASCII será escapado. |
| jq | shell | — | jq . archivo.json, y jq -S . para ordenar claves. Antes de jq 1.7, los enteros grandes eran alterados silenciosamente. |
| Línea de comandos | python3 -m json.tool | — | Presente en casi todas las máquinas, con --indent, --sort-keys y --no-ensure-ascii. |
| Go | encoding/json | biblioteca estándar | json.MarshalIndent para un valor, json.Indent para bytes que ya tienes. Ambos escapan corchetes angulares. |
| Java | Jackson | — | writerWithDefaultPrettyPrinter(). Su valor predeterminado imprime matrices en una línea hasta que configuras un indentador de matrices. |
| C# | System.Text.Json | .NET Core 3+ | JsonSerializerOptions { WriteIndented = true }. Escapa mucho más de lo que la especificación requiere. |
| PHP | json_encode | integrado | JSON_PRETTY_PRINT, más JSON_UNESCAPED_SLASHES y JSON_UNESCAPED_UNICODE, que casi siempre quieres. |
| Ruby | JSON.pretty_generate | biblioteca estándar | No es lo mismo que to_json, que se mantiene compacto. |
| Rust | serde_json | — | to_string_pretty. El valor ordena claves a menos que la función preserve_order esté habilitada. |
| PowerShell | ConvertTo-Json | integrado | El valor predeterminado es -Depth 2 y trunca silenciosamente por debajo de él. Siempre pasa -Depth explícitamente. |
Preguntas frecuentes
¿Cómo doy formato bonito a JSON en JavaScript?
JSON.stringify(value, null, 2). Los tres argumentos son el valor, un reemplazador y la sangría — así que el error que todo el mundo comete una vez es JSON.stringify(value, 2), que pone el 2 en el hueco del reemplazador, no hace nada y devuelve la cadena minificada. Pasa "\t" en lugar de 2 para tabulaciones. Ten presente lo que stringify descarta en silencio por el camino: los valores undefined y las funciones desaparecen de los objetos y se convierten en null dentro de los arrays, un Map o un Set se convierte en {}, y un BigInt lanza una excepción.
¿Cómo doy formato bonito a JSON en Python?
json.dumps(obj, indent=2). El valor por defecto que despista es ensure_ascii=True, que escapa todos los caracteres no ASCII — "café" sale como "caf\u00e9", válido e ilegible. Pasa ensure_ascii=False para conservar UTF-8, y al hacerlo abre cualquier archivo de salida con encoding="utf-8". Con sort_keys=True se ordena alfabéticamente, que es lo que hace que dos salidas se puedan comparar.
¿Cómo doy formato bonito a JSON desde la línea de comandos?
jq . file.json si tienes jq instalado; python3 -m json.tool file.json si no, lo que cubre casi cualquier máquina con Python. jq añade ordenación con -S, sangría configurable con --indent y compactación con -c. Una advertencia: hasta jq 1.6, los números se analizaban como doubles, así que un ID de 64 bits podía volver cambiado en silencio — jq 1.7 conserva los literales numéricos sin modificar, así que comprueba la versión antes de pasar identificadores por él.
¿El JSON con formato bonito sigue siendo JSON válido?
Sí. El espacio en blanco entre tokens no lleva ningún significado en JSON, así que un documento indentado y uno minificado se analizan en exactamente el mismo valor — el RFC 8259 permite espacio, tabulación, salto de línea y retorno de carro en cualquier lugar entre tokens estructurales. La única diferencia es el tamaño: la sangría suele añadir 20–40%, que conviene quitar antes de enviar una carga por la red y conservar en todo lo que vaya a leer una persona.
¿Cuál es la diferencia entre pretty print, format y beautify?
Ninguna, como verbos — todos significan añadir espacio en blanco para que la estructura se vea. Las tres páginas de aquí se diferencian en lo demás que hacen. Esta empareja el formateador con el código para hacerlo en cada lenguaje. «Formatear JSON» tiene el conjunto completo de opciones: eliminación de comentarios JSONC, ordenación de claves, escape Unicode. «Embellecer JSON» apunta al trabajo concreto de devolver un blob minificado a algo legible. Elige el que encaje con lo que venías a hacer.
¿Por qué mi salida con formato bonito tiene escapes \u?
Porque el serializador escapó los caracteres no ASCII, y varios lo hacen por defecto. El json.dumps de Python tiene ensure_ascii=True; el System.Text.Json de C# escapa todo aquello que a su codificador seguro para HTML no le gusta; PHP escapa el no ASCII salvo que se lo indiques. Todo eso es JSON válido y nada de ello es legible. La solución es un argumento en cada caso — ensure_ascii=False, UnsafeRelaxedJsonEscaping, JSON_UNESCAPED_UNICODE — y el selector de arriba lo muestra para el lenguaje en el que estés.
¿Se sube mi JSON a un servidor?
No. El análisis y la re-serialización ocurren en esta pestaña, en JavaScript ya cargado en la página, y al otro lado no hay ningún endpoint al que enviar nada. Esto importa aquí más de lo que puede sonar: los documentos que la gente formatea bonito son respuestas de API y líneas de registro, que rutinariamente llevan tokens, identificadores de sesión y registros de clientes.