También disponible en: English · Português · Français · العربية
Formatear JSON online
Valida y da formato a tu JSON en el navegador, con un parser propio que no te cambia ni un dígito ni te esconde una clave repetida.
Qué es un formateador de JSON
Formatear JSON significa coger un documento —minificado en una sola línea, pegado desde el log de una API, exportado de una base de datos— y devolverlo legible: sangría consistente, una clave por línea, fácil de recorrer con la vista. Pero indentar bien es la parte fácil; lo que de verdad importa es que antes de tocar una sola línea el formateador confirme que el documento es JSON válido y, si no lo es, diga exactamente por qué.
Esta página hace las dos cosas —formatear JSON y validarlo— pero con una diferencia de fondo frente a casi cualquier otra que vas a encontrar: no usa el JSON.parse del navegador. Tiene su propio parser, escrito para esto, y esa decisión cambia lo que la herramienta puede contarte sobre tu documento. Se explica en detalle más abajo.
Cómo se usa
- Pega tu JSON. Escríbelo o pégalo en el cuadro de arriba; la herramienta lo valida y lo reformatea en cada pulsación, sin ningún botón de «formatear» de por medio.
- Elige sangría y orden. Con los botones 2 espacios, 4 espacios, Tabulador o Minificar decides cómo se indenta la salida; marca Ordenar claves alfabéticamente si además quieres que las claves de cada objeto salgan ordenadas —viene desmarcado por defecto.
- Copia el resultado. El cuadro de salida es de solo lectura: usa Copiar para llevártelo al portapapeles (el botón pasa a decir ¡Copiado! durante dos segundos), Limpiar para vaciarlo todo, o Cargar un ejemplo si quieres ver la herramienta en marcha antes de pegar tu propio JSON.
Por qué este formateador no usa JSON.parse
La razón corta es la precisión numérica, y se puede medir. Pásale {"id": 12345678901234567890} a un formateador con JSON.parse y JSON.stringify de por medio, y sale {"id":12345678901234567000} —cambian las tres últimas cifras, porque un double de JavaScript solo guarda hasta 17 cifras significativas. Con {"price": 0.1000000000000000055511151231257827} pasa lo mismo por el otro lado: vuelve {"price":0.1}, y esa diferencia minúscula ya no está. Esta herramienta no convierte los números a double en ningún momento: guarda el texto original de cada uno y lo reescribe cifra por cifra, así que formatear nunca altera un valor. Los números que de todos modos exceden lo que un double puede representar se listan aparte, uno por uno, porque cualquier cosa que después llame a JSON.parse sobre tu resultado —incluida la app en la que vas a pegarlo— los va a cambiar igual; conservarlos aquí no los vuelve seguros en el siguiente paso, y la página lo dice sin rodeos.
Con las claves repetidas pasa algo parecido. {"id": 1, "name": "a", "id": 2} es JSON válido —la especificación no prohíbe repetir una clave—, pero JSON.parse no dice nada al respecto: se queda con la última en silencio y entrega {"id":2,"name":"a"}, sin ninguna señal de que el primer valor existió alguna vez. Esta herramienta informa de cada repetición, con su número de línea, y conserva las dos entradas en la salida. Eso sí, es un límite honesto y no una promesa que se extienda más allá de esta página: si copias ese resultado a algo que a su vez use JSON.parse, ese consumidor va a volver a quedarse solo con la última clave.
El resto de decisiones sigue la misma lógica de ser sincera antes que cómoda. Ordenar las claves alfabéticamente reescribe el orden en el que aparecen en el objeto —la especificación dice que ese orden no importa, pero a un diff o a una revisión de código sí le importa, así que la casilla viene desmarcada por defecto en vez de asumir que quieres reordenar nada. Y como el parser corre en el hilo principal de la pestaña, un archivo de varios megabytes va a dejarla congelada mientras lo procesa; nada exótico, pero conviene saberlo antes de pegar un dump entero.
Mensajes de error que dicen qué falló, no lo que el parser esperaba
Hay que ser justos aquí, porque la comparación honesta resulta más interesante que la exagerada: Chrome y Node modernos ya indican la posición en la mayoría de los errores de JSON. Para {"a": 1,} —una coma final antes de cerrar— el parser nativo responde Expected double-quoted property name in JSON at position 8 (line 1 column 9). Eso ya es mucho más de lo que daba hace unos años.
Quedan dos huecos reales, no inventados para justificar la herramienta. El primero: esa posición no siempre aparece. {"a": True} —un True con mayúscula, colado de Python— produce solo Unexpected token 'T', "{"a": True}" is not valid JSON, sin línea ni columna. El segundo: el mensaje describe lo que el parser esperaba encontrar a continuación, no lo que tú escribiste. Esta herramienta va por el otro lado y nombra el fallo en sí —coma final, comillas simples en vez de dobles, una clave sin comillas, los True, False o None de Python colados en JSON, un comentario, un cero a la izquierda, un salto de línea literal dentro de un string— 18 tipos de error en total, cada uno con su línea, su columna y la línea de origen con un cursor debajo de la columna exacta. Y apunta al carácter que realmente falló: en un documento de cuatro líneas con una coma final señala la línea 3, columna 12 —la coma en sí, no la llave de cierre de la línea siguiente, que es donde el parser se da cuenta del problema. También marca lo que un JSON estricto no admite y que otros formateadores dejan pasar sin avisar: los comentarios y las comas finales salen como error aquí, no en silencio; si lo que necesitas es JSON5 o JSONC, esta no es tu herramienta, aunque al menos te va a decir qué línea tienes que arreglar.
Todo esto se contrastó contra el parser nativo, no se afirma sin más. Se generaron 20.000 documentos, 13.323 de ellos corrompidos a propósito insertando, borrando o sustituyendo un carácter al azar, y este parser coincidió con JSON.parse sobre si cada uno era válido en absolutamente todos los casos: cero discrepancias. Todo documento que ambos aceptaron, además, se reformateó a algo que vuelve a parsear a un valor idéntico —formatear dos veces no cambia nada, y los objetos y arrays vacíos se quedan compactos como {} y [] en vez de repartirse en tres líneas porque sí.
Por qué esta herramienta es gratis
Todo el procesamiento pasa en tu navegador: no hay backend leyendo tu JSON, ni cuenta que crear, ni límite de usos que se dispare al tercer archivo. FreeToGenerate.com no vive de cobrarte por una función que un parser en JavaScript ya resuelve gratis.
Y como no se sube nada a ningún servidor, sirve igual para el config con credenciales o la respuesta de API que ibas a pegar sin pensarlo dos veces en el primer formateador que apareciera en el buscador. No hay marca de agua en el resultado, ni una versión de pago con más funciones esperando detrás de un muro.