Formatear JSON parece lo mas simple que una herramienta puede hacer: agregar
algunos espacios y saltos de linea para que un humano pueda leerlo. La
mayoria de formateadores hacen exactamente eso llamando a JSON.parse y luego
a JSON.stringify con un argumento de indentacion. Ese viaje de ida y vuelta
funciona para el JSON que escribes a mano y se rompe silenciosamente con el
JSON que obtienes de otra parte.
Los dos errores que causa el viaje de ida y vuelta
JSON.parse convierte cada numero en un double de JavaScript. Un double no
puede contener cada entero exactamente despues de Number.MAX_SAFE_INTEGER,
que es 9007199254740991. Un ID de copo de nieve, una clave primaria de base
de datos, o una marca de tiempo en nanosegundos puede facilmente exceder
ese limite, y una vez que lo hace, re-serializar el valor analizado cambia
los digitos. 12345678901234567890 vuelve como
12345678901234567000. Nadie se da cuenta hasta que el ID es incorrecto en
alguna parte aguas abajo.
El mismo viaje de ida y vuelta tambien reordena las claves de objetos que
parecen numeros, ya que JSON.stringify recorre las claves enumerables
propias de un objeto JavaScript en un orden especifico: claves tipo entero
primero, en orden ascendente, luego todo lo demas en orden de insercion. Un
documento escrito como {"2": "b", "1": "a"} vuelve como
{"1": "a", "2": "b"}, que es un documento diferente aunque cada valor
sobrevivio.
Que hace el formateador de JSON en su lugar
Esta herramienta nunca llama a JSON.parse. Tokeniza tu documento, valida
el flujo de tokens contra RFC 8259, y reimprime a partir de esos tokens. Un
numero se copia como los caracteres exactos que escribiste, no se
re-codifica a traves de un double. Una clave se queda donde la pusiste.
Pegando
{"2":"second","1":"first","id":12345678901234567890,"note":"line1\nline2"}
y presionando Formatear devuelve:
{
"2": "second",
"1": "first",
"id": 12345678901234567890,
"note": "line1\nline2"
}
"2" se queda antes de "1", y el id de veinte digitos vuelve exactamente
como se escribio. Solo el espacio en blanco cambio.
Leyendo un error
Si el documento no es JSON valido, la herramienta marca la linea ofensiva en el gutter y nombra el error real en lugar de citar el token en el que se atascó. Una coma final antes de una llave de cierre se reporta como una coma final, en la linea donde esta la coma, no al final del archivo donde un analizador simple se rinde.
Formatear vs Minificar
Ambos botones hacen la misma reimpresion a partir de tokens; solo el espacio en blanco difiere. Formatear agrega saltos de linea y el ancho de indentacion que elegiste (2 espacios, 4 espacios, o una tabulacion). Minificar elimina cada espacio, tabulacion y salto de linea que JSON no requiere. Ninguno cambia un valor, por lo que es seguro presionar cualquiera de ellos tantas veces como quieras, o alternar entre ellos sin volver a pegar nada.
Pruébalo en un documento con un ID largo o un archivo de configuracion con
claves numericas, y compara el resultado con un formateador que pasa por
JSON.parse. La diferencia se muestra inmediatamente.