Formateador de JSON
Formatea JSON con 2 espacios, 4 espacios o tabulaciones, sin perder ni un dígito.
Nada de lo que pegues sale de tu navegador. La lista de permitidos de connect-src convierte eso en una garantía del navegador, no en una promesa. Compruébalo tú mismo
Formatear JSON consiste en añadir el espacio en blanco que una persona necesita y una máquina no: un miembro por línea, indentación coherente, un espacio después de cada dos puntos. Los datos no cambian. Solo cambia su presentación.
La parte fácil de estropear es justo esa última frase. Un formateador que parsea tu documento a valores de JavaScript y los vuelve a serializar ya ha reescrito tus números antes de imprimir nada, y la mayoría hace exactamente eso.
Lo que formatear no cambia
Este formateador vuelve a emitir los tokens que ha leído en lugar de reserializar valores ya parseados. Eso significa que el texto de cada número, cadena y literal vuelve byte a byte, y que solo se reescribe el espacio en blanco que hay entre ellos.
Importa más de lo que parece. Pasa un documento con un ID de 19 dígitos por un formateador construido sobre JSON.parse y JSON.stringify y el ID vuelve distinto, en silencio, sin ningún aviso en la interfaz.
- Los números conservan su texto exacto
- 1.50 sigue siendo 1.50, 1e3 sigue siendo 1e3, -0 sigue siendo -0, y 12345678901234567890 sigue siendo él mismo en vez de convertirse en 12345678901234567000.
- Las cadenas se copian literalmente
- Un \u00e9 escapado sigue escapado y una é literal sigue siendo literal. Formatear no es el momento de decidir cómo debe codificarse una cadena, así que no lo decide.
- Se conserva el orden de las claves
- Salvo que actives el ordenado explícitamente. Los objetos JSON no tienen orden según la especificación, pero en la práctica todos los parsers conservan el orden de inserción y los diffs dependen de ello.
- Las claves duplicadas se conservan y se señalan
- Eliminar una cambiaría lo que ve quien consume el documento. En su lugar recibes un aviso que indica las dos posiciones.
Qué indentación elegir
Dos espacios es el valor por defecto aquí porque es lo que emiten npm, Prettier y casi todo el tooling de JavaScript, y porque el anidamiento en JSON se hace profundo enseguida. Cuatro espacios se leen mejor en archivos de configuración poco anidados. Las tabulaciones dejan que cada lector elija su propio ancho, que es el argumento de accesibilidad a su favor, y comprimen algo mejor.
Para cualquier cosa que se transmita en lugar de leerse, minifica. El espacio en blanco en una respuesta JSON es puro sobrecoste, y en un payload de API típico supone entre el 10 y el 20 por ciento de los bytes.
Saltos de línea y nueva línea final
La salida usa LF por defecto. Existe una opción CRLF porque el tooling de Windows y algunos sistemas de CI se fijan en ello, y porque un archivo que mezcla ambos produce un diff en el que todas las líneas parecen modificadas.
El espacio en blanco fuera de las cadenas no significa nada para un parser, así que nada de esto afecta a la validez. Afecta a tus diffs, que en la práctica es lo que se nota.
How to do this in code
La misma operación en código. Todas estas opciones producen indentación de dos espacios; todas ellas reescribirán también tus números, que es el precio que aceptas cuando el payload no contiene enteros grandes.
js JavaScript
El tercer argumento acepta un número de espacios o una cadena que se usará como unidad de indentación.
const pretty = JSON.stringify(JSON.parse(text), null, 2);
// Tabs
const tabbed = JSON.stringify(JSON.parse(text), null, '\t'); py Python
ensure_ascii vale True por defecto, lo que convierte cada carácter acentuado en un escape \u. Casi nadie quiere eso.
import json
pretty = json.dumps(json.loads(text), indent=2)
# Keep non-ASCII readable rather than escaping it
pretty = json.dumps(json.loads(text), indent=2, ensure_ascii=False)
# From the command line
# python -m json.tool --indent 2 input.json sh jq
jq no ordena nada por defecto. Añade -S para ordenar las claves.
jq . input.json # 2 spaces, the default
jq --indent 4 . input.json
jq --tab . input.json
jq -c . input.json # compact go Go
json.Indent es lo más parecido en una biblioteca estándar a lo que hace esta página: reformatea los bytes sin decodificar los valores.
var buf bytes.Buffer
if err := json.Indent(&buf, data, "", " "); err != nil {
return err
}
// json.Indent works on raw bytes, so unlike Unmarshal it does
// not touch your numbers at all. rb Ruby
require 'json'
pretty = JSON.pretty_generate(JSON.parse(text)) php PHP
PHP indenta con cuatro espacios y escapa las barras y el Unicode si no pasas esas banderas.
$pretty = json_encode(
json_decode($text),
JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE
); Preguntas frecuentes
- ¿Hay algún límite de tamaño?
- Esta página no impone ninguno. El techo real es tu navegador: un motor de JavaScript limita una sola cadena a unos 512 MB, así que nada mayor puede siquiera mantenerse en memoria. Formatear un documento de 10 MB supone aquí unos 780 milisegundos de trabajo, que se ejecutan en un worker en segundo plano para que la página siga respondiendo.
- ¿Formatear cambia mis datos?
- No. El espacio en blanco fuera de las cadenas no tiene significado en JSON, y este formateador vuelve a emitir cada valor exactamente como lo escribiste en lugar de parsearlo y reserializarlo. Activar el ordenado de claves sí cambia el documento, y por eso está desactivado por defecto.
- ¿Por qué mi archivo formateado se ve distinto al que produce mi editor?
- Lo más probable es que sea la nueva línea final o el estilo de los arrays de objetos. Algunos formateadores dejan los arrays cortos en una sola línea; este es coherente, lo que produce más líneas pero diffs mucho más legibles.