Español

Herramientas de desarrollo · JSON formateador y validador

Toda la gramática JSON en una página: seis tipos de valores, dos contenedores

· Antecedentes

json estándares validación

Toda la gramática JSON en una página: seis tipos de valores, dos contenedores ilustrados con tokens JSON y un límite de validación preciso
Toda la gramática de
Ilustración de vector original de ToolAcre

JSON cabe en una página y saberla de memoria hace que cada error del validador sea obvio. Esta publicación analiza los seis tipos de valores, los dos contenedores y el puñado de reglas que hacen tropezar a las personas.

Cada error que hayas visto proviene de una página.

Cada error de sintaxis es una expectativa incumplida en una gramática compacta. Después de que se abre un objeto, un analizador espera un nombre de miembro entre comillas o una llave de cierre; después de un nombre, espera dos puntos; después de un valor, espera una coma o el final del contenedor. Leer un error como una transición fallida es más útil que tratar al personaje reportado como misterioso.

ToolAcre acepta los valores y espacios en blanco estándar JSON, luego aplica dos límites de entrada prácticos. El texto con más de 8,000,000 caracteres se rechaza antes del análisis, y el anidamiento del escáner más allá de los contenedores 512 se rechaza en lugar de recorrerlo indefinidamente. Esos son límites de productos, no nuevos tipos de JSON. Dentro de ellos, el diagnóstico identifica el primer punto donde el flujo de tokens ya no puede satisfacer la gramática.

Los seis valores: objeto, matriz, cadena, número, verdadero/false y nulo, y el hecho de que no hay nada más

Un valor JSON es un objeto, matriz, cadena, número, booleano o nulo. Los objetos y matrices pueden contener cualquiera de los seis, incluidos más contenedores. La ortografía literal es exactamente `true`, `false` y `null`; La capitalización no es flexible. Los tokens como `True`, `None`, `undefined`, `NaN` y `Infinity` están fuera del estricto JSON incluso cuando otro idioma reconoce algunos de ellos.

Esta breve lista hace que la clasificación sea una técnica de depuración útil. En `{"reading": NaN}`, los dos puntos introducen correctamente un valor, pero `N` no puede comenzar ningún valor permitido. Reemplácelo solo después de decidir qué deberían significar los datos, tal vez `null` o un estado citado. Una herramienta de sintaxis puede rechazar el token; no puede elegir el sustituto de la aplicación ni decidir si el campo pertenece allí.

Objetos y matrices: miembros separados por comas, dos puntos y por qué RFC 8259 deja el orden y los nombres duplicados a las implementaciones

Los objetos contienen nombres separados por comas /value miembros. Cada nombre es una cadena entre comillas dobles seguida de dos puntos y un valor. Las matrices contienen valores separados por comas sin nombres ni dos puntos. Los contenedores `{}` y `[]` vacíos son válidos, pero una coma no puede ir delante, detrás ni aparecer dos veces. Hacer coincidir cada delimitador con su contenedor expone rápidamente muchas fallas aparentes de "tokens inesperados".

Se espera que los nombres de los objetos sean únicos, pero este validador no rechaza la ortografía duplicada. `{"port": 80, "port": 443}` analiza y `JSON.parse` conserva el valor posterior. Luego, el formateo emite solo el miembro superviviente, por lo que el texto anterior no se puede recuperar del resultado. Las posiciones de la matriz se comportan de manera diferente: cada elemento permanece presente y su orden es parte del valor.

Cadenas y números con precisión

Las cadenas utilizan comillas dobles. Una barra invertida puede introducir una comilla, una barra invertida, una barra inclinada, `b`, `f`, `n`, `r`, `t` o un escape Unicode de cuatro dígitos; Los personajes de control sin formato están prohibidos. Las comillas simples son tokens no válidos ordinarios fuera de una cadena. Estas reglas explican por qué los literales de JavaScript copiados y el texto de varias líneas pegado pueden parecer legibles aunque no superen la validación estricta JSON.

Un número puede tener un signo menos, una parte entera, una fracción opcional y un exponente opcional. No puede comenzar con `+`, usar notación hexadecimal, llevar un cero a la izquierda antes de otro dígito ni escribir un valor no finito. `-0.25e+2` es válido; `01`, `.5`, `2.` y `Infinity` no lo son. El análisis comprueba la gramática, no si JavaScript puede conservar cada dígito exactamente.

Espacios en blanco y nivel superior

Fuera de las cadenas, JSON los espacios en blanco se limitan a espacio, tabulación horizontal, avance de línea y retorno de carro. Un espacio continuo copiado de una página web no es intercambiable con un espacio ordinario. El formato puede elegir libremente entre los espacios en blanco permitidos alrededor de los tokens, pero debe preservar los espacios en blanco que pertenecen dentro de una cadena entre comillas porque esos caracteres son datos.

El documento completo puede ser cualquier valor único JSON, no solo un objeto o matriz. `42`, `false` y `"ready"` son textos válidos de nivel superior. Lo que está prohibido es un segundo valor después del primero: `42 43` son dos documentos, no uno. Esta distinción explica por qué JSON delimitado por nuevas líneas requiere un manejo registro por registro en lugar de un análisis ordinario de todo el archivo.

Ejemplo resuelto: analizar un documento pequeño a mano

Tome `{"order": [17, null, {"paid": true}], "note": "ship soon"}`. El objeto raíz comienza con un miembro llamado `order`; su valor es una matriz que contiene un número, un nulo y otro objeto. Luego, una coma introduce `note`, cuyo valor es una cadena con una nueva línea de escape. Cada dos puntos, coma y delimitador de cierre tiene una función gramatical.

Ahora elimine la cotización anterior a `paid`. Después de la llave anidada, el analizador espera una llave de cierre o un nombre entre comillas, por lo que falla en `p`. Alternativamente, agregue una coma después de `true`; el analizador acepta la coma y luego falla en `}` porque debe seguir otro miembro. Predecir esas posiciones a mano convierte la validación en confirmación y desalienta las ediciones aleatorias de puntuación.

Lo que esto no cubre

La gramática no tiene tipo de fecha, dinero decimal, binario, UUID o duración. Las aplicaciones suelen representar esos conceptos con cadenas o números e imponen convenciones por separado. Una marca de tiempo puede ser una cadena JSON perfectamente válida y que contenga una fecha imposible. Del mismo modo, un objeto sintácticamente válido puede omitir propiedades requeridas o utilizar unidades incorrectas sin violar una sola regla de análisis.

ToolAcre no realiza comprobaciones de esquema, validación de dominio ni canonicalización. Tampoco reinterpreta características JSON5 o JSONC como comentarios y comas finales. Su trabajo es más limitado: aceptar un texto JSON estricto dentro de los límites del producto, formatear el valor analizado e identificar fallas de sintaxis. Mantenga las preguntas posteriores sobre la forma y el significado en la capa de validación de la aplicación consumidora.

Conclusión: memoriza la gramática, confía en la posición

La lista de verificación duradera es breve: seis categorías de valores, nombres de objetos entre comillas, comas solo entre elementos, dos puntos solo entre nombres y valores, escapes de cadena estrictos, ortografía de números estricta, cuatro espacios en blanco y exactamente un valor de nivel superior. Cuando un documento falla, identifique lo que permitía la gramática inmediatamente antes de la posición informada y compare esa expectativa con el carácter realmente presente.

Confía en la posición como el primer punto imposible, no siempre en el carácter que necesita ser eliminado. Es posible que se resalte una llave de cierre porque una coma anterior prometía otro miembro; una carta inocente puede resaltarse porque falta la cita inicial. Repare la causa, vuelva a ejecutar la validación y repita. Para entradas de gran tamaño o extremadamente profundas, aborde el límite del producto de 8 millones de caracteres o 512 de profundidad antes de que el diagnóstico de sintaxis pueda ayudar.