Formateador y validador JSON

Formatee, valide e inspeccione JSON, con un error que apunta al carácter.

Salida
{
  "name": "jaguar",
  "speed_kph": 80,
  "habitats": [
    "rainforest",
    "wetland"
  ],
  "conservation": {
    "status": "Near Threatened",
    "assessed": 2016
  },
  "nocturnal": null
}

JSON válido

Tamaño
145 B
Minificado
145 B
Ahorrado
0%
Claves
7
Objetos
2
Profundidad máxima
3

Los cuatro errores

Casi todos los documentos rechazados fallan por una del mismo puñado de razones, y las cuatro son cosas que JavaScript habría aceptado. Ahí está la trampa: JSON se parece a un literal de objeto de JavaScript y es un subconjunto mucho más estricto.

EscritoProblemaCorrecto
{"a": 1,}Coma sobrante{"a": 1}
{'a': 1}Comillas simples{"a": 1}
{a: 1}Clave sin comillas{"a": 1}
{"a": 1} // notaComentarioQuítalo

Otros dos que pillan a menos gente pero cuestan más de ver. NaN, Infinity y undefined son valores válidos de JavaScript y ninguno es un valor de JSON: el sustituto es null o una cadena. Y un salto de línea literal dentro de una cadena no es válido; tiene que ser los dos caracteres \n.

Cómo informa de los errores este validador

Vale la pena explicarlo porque es el motivo para elegir un formateador y no otro. Para el camino correcto se usa el propio JSON.parse del navegador, pero no para describir los fallos: el formato de sus mensajes es un detalle de implementación que ha cambiado dos veces en versiones recientes de V8. El mismo documento roto da «Unexpected end of JSON input» en una versión de Node y «Expected ‘,’ or ‘}’ after property value at position 6» en otra, y a veces no da posición alguna.

Por eso, cuando el análisis falla, esta página recorre la propia gramática e informa de la línea, la columna y el carácter donde se ha detenido, con un cursor debajo. El mensaje que recibes no depende del navegador que estés usando.

El problema de precisión del que nadie te avisa

Este causa errores de verdad y casi nunca se menciona. Los números de JSON se convierten en números de JavaScript, y los números de JavaScript son dobles IEEE 754. Los enteros por encima de 2⁵³ —unos 9,007 billones— no se pueden representar de forma exacta.

Un identificador de 19 dígitos como los que generan Twitter, Discord y casi todos los esquemas de ID estilo Snowflake volverá cambiado, en silencio y sin ningún error por ningún lado. Pega {"id": 9007199254740993} en el formateador de arriba y mira cómo se mueve el último dígito.

La solución está en el lado que produce los datos: manda los identificadores de 64 bits como cadenas. Todas las API a las que esto les ha mordido ya lo hacen.

Cuándo echar mano de otra cosa

Esta página sirve para leer y arreglar un documento que tienes delante. Hay dos tareas vecinas para las que es la herramienta equivocada:

  • Consultar y transformar. jq en la línea de órdenes, que además procesa en flujo en lugar de cargarlo todo en memoria: la respuesta correcta para cualquier cosa de más de unos pocos megabytes.
  • Imponer una forma. Eso es JSON Schema, y validar la estructura es una pregunta distinta de validar la sintaxis. Un documento puede estar perfectamente bien formado y aun así no traer ninguno de los campos que tu API exige.

Relacionado

Si el JSON te ha llegado codificado en Base64, descodifícalo primero. Si ha salido de un token, el descodificador de JWT separa y analiza los dos segmentos por ti. Y si va a ir dentro de una URL, el codificador de URL te muestra cuál de las tres reglas de escapado quieres.

Preguntas sobre JSON

¿Por qué falla mi JSON cuando se ve bien?

Cuatro causas explican casi la totalidad. Una coma final antes de un corchete de cierre, que JavaScript acepta y JSON no. Comillas simples en lugar de comillas dobles. Comentarios, para los cuales JSON no tiene ninguna sintaxis. Y claves sin comillas: {name: "x"} es JavaScript válido y JSON no válido. El validador anterior nombra cuál de estos encontró en lugar de reiterar el error del analizador.

¿Es seguro pegar datos de producción aquí?

En esta página, sí, se analiza en su navegador y no hay ninguna solicitud que pueda transportarla. Puedes confirmarlo mirando la pestaña de red mientras escribes. Sin embargo, vale la pena mantener el hábito general: la depuración de JSON por parte de la gente suele ser una respuesta API real con registros de clientes reales, y muchos formateadores en línea lo publican en un servidor para hacer el trabajo. Comprobar antes de pegar, en cualquier herramienta.

¿JSON puede tener comentarios?

No. Douglas Crockford los eliminó deliberadamente, porque la gente había comenzado a ponerles directivas de análisis. Si necesita comentarios en un archivo de configuración, las respuestas habituales son JSON5 o JSONC (lo que usa VS Code), o una convención: una clave "_comment" que los consumidores ignoran. Ninguno de ellos es JSON, por lo que un analizador estricto aún los rechazará.

¿Qué hace las "claves de clasificación" y por qué querría usarlas?

Reordena las claves de cada objeto alfabéticamente y de forma recursiva. Los objetos JSON están desordenados según la especificación, por lo que dos documentos que difieren sólo en el orden de las claves son equivalentes, pero una diferencia de texto muestra cada línea modificada. Clasificar ambos antes de compararlos colapsa con las diferencias que realmente importan.

¿Hay un límite de tamaño?

Sólo el de tu navegador. El análisis se realiza en la página, por lo que unos pocos megabytes están bien en una computadora de escritorio y harán que un teléfono más antiguo funcione. Los documentos muy grandes se manejan mejor con jq en la línea de comando, que transmite en lugar de mantener todo el árbol en la memoria.

¿Por qué mi número entero grande resulta incorrecto?

Porque los números JSON se convierten en números de JavaScript, que son dobles de IEEE 754, y pierden precisión por encima de 2⁵³, aproximadamente 9,007 mil billones. Una identificación de 19 dígitos estilo Twitter o un bigint de base de datos aparecerán sutilmente alterados. Esto no es un error en el formateador; es por eso que las API que usan ID de 64 bits los envían como cadenas.

Última revisión . ¿Has visto algo desactualizado? Dínoslo.