Saltar al contenido principal

Hoja de trucos de sintaxis JSON

La sintaxis de JSON, tal como la define RFC 8259, se reduce a seis caracteres estructurales, cuatro caracteres de espacio en blanco legales, dos contenedores, seis tipos de valores y una gramática estricta para cadenas y números. Esta hoja de trucos pone cada regla en una sola página — incluidos los errores exactos que los analizadores rechazan, desde las comas finales hasta los literales hexadecimales.

Solo local

Hoja de trucos de sintaxis JSON: explicación

La gramática completa de JSON cabe en unas pocas docenas de líneas de ABNF, y casi todos los errores de análisis del mundo real son una de una docena de equivocaciones concretas. Esta página es la versión de referencia de ese conocimiento: cada sección enuncia una porción de la gramática exactamente como la define RFC 8259 y luego muestra la regla como JSON copiable que puedes pegar en un formateador o validador y ver pasar o fallar.

Tres documentos importan si quieres fuentes primarias. RFC 8259 es el estándar de Internet vigente, ECMA-404 es el estándar gemelo idéntico publicado por Ecma International, y la gramática de números dentro de RFC 8259 reutiliza deliberadamente la gramática de números de la especificación ECMAScript con sus extensiones octal y hexadecimal eliminadas. Cada regla de abajo tiene su origen en una de esas tres fuentes — aquí nada es convención ni folclore.

Las reglas son breves pero implacables: no existe un JSON indulgente. Un analizador conforme acepta un documento entero o lo rechaza con un error de sintaxis, y los rechazos se concentran en el puñado de reglas que las personas desarrolladoras olvidan más a menudo — el estilo de comillas, las comas finales, los comentarios, los ceros a la izquierda. Apréndetelas una vez aquí abajo y la mayoría de los fallos de validación dejan de ser misterios.

Las reglas se fijan más rápido cuando las rompes a propósito, así que deja el formateador de JSON abierto en una segunda pestaña y reindenta cada ejemplo de esta página a medida que lo lees.

Cuando quieres un veredicto y no un formateo bonito, el validador de JSON informa de la línea y la columna exactas de la primera regla que incumple un documento.

Los seis caracteres estructurales

Seis caracteres de puntuación cargan con toda la estructura en JSON: las llaves { } que envuelven objetos, los corchetes [ ] que envuelven arrays, los dos puntos : que separan una clave de su valor, y la coma , que separa pares dentro de un objeto o valores dentro de un array. Nada más en la gramática hace trabajo estructural — cualquier otro carácter de un documento está dentro de una cadena o es uno de los cuatro caracteres de espacio en blanco. Una coma es estrictamente un separador: puede aparecer entre dos elementos, nunca delante de una llave o un corchete de cierre.

CaracteresNombreFunción en la gramática
{ }LlavesAbrir y cerrar un objeto — un conjunto de pares clave/valor
[ ]CorchetesAbrir y cerrar un array — una lista ordenada de valores
:Dos puntosSepara una clave de su valor dentro de un objeto
,ComaSepara pares o elementos de un array — nunca lo último antes de un cierre

Válido — comas solo entre elementos

{"name":"Ada","tags":["math","pioneer"]}

Inválido — coma final antes de un cierre

{"name":"Ada","tags":["math","pioneer"],}

Espacio en blanco: exactamente cuatro caracteres

Fuera de las cadenas, JSON permite exactamente cuatro caracteres de espacio en blanco: el espacio (U+0020), el tabulador horizontal (U+0009), el salto de línea (U+000A) y el retorno de carro (U+000D). Cualquier otra cosa — tabulador vertical, alimentación de formulario, espacio duro, una marca de orden de bytes — es un error de sintaxis, aunque muchos editores muestren esos caracteres de forma invisible. Por eso el JSON pegado desde un procesador de textos falla tan a menudo la validación: el documento se ve limpio en pantalla y contiene caracteres que la gramática no conoce.

El espacio en blanco es también lo que hace posible dar formato. Como la gramática ignora estos cuatro caracteres entre tokens, el mismo documento puede ser una única línea larga en la transmisión y un árbol indentado en tu editor, y las dos formas son semánticamente idénticas — ningún analizador puede distinguirlas después de leer.

Minificado — sin espacio en blanco opcional

{"a":1,"b":[2,3]}

Con formato bonito — espacio en blanco añadido, datos sin cambios

{
  "a": 1,
  "b": [
    2,
    3
  ]
}

Cadenas: comillas dobles y los nueve escapes

Una cadena JSON va envuelta en comillas dobles — nunca comillas simples. Dentro, la barra invertida \ introduce un escape, y RFC 8259 define exactamente nueve escapes de dos caracteres: dos son obligatorios, \\" para una comilla doble literal y \\\\ para una barra invertida literal, porque esos dos caracteres, de otro modo, terminarían o corromperían la cadena. Seis más son abreviaturas opcionales — \/ para la barra diagonal y \b \f \n \r \t para los cinco caracteres de control que aparecen con más frecuencia en el texto. La novena forma es \uXXXX, que escribe cualquier punto de código Unicode mediante su número hexadecimal de cuatro dígitos.

Todos los caracteres fuera del conjunto de escapes pueden aparecer literalmente como UTF-8, y las dos formas son equivalentes: un analizador entrega la cadena idéntica de cualquier manera. Escapar es grafía, no datos — un punto que la guía de escape desarrolla a fondo.

EscapeProduceEstado según RFC 8259
\"comilla dobleObligatorio — la única forma de poner comillas dentro de una cadena
\\barra invertidaObligatorio — la única forma de escribir una barra invertida literal
\/barra diagonalAbreviatura opcional, legal pero raramente necesaria
\b \f \n \r \tretroceso, alimentación de formulario, salto de línea, retorno de carro, tabuladorEscapes con nombre para los cinco caracteres de control más comunes
\uXXXXcualquier punto de código, p. ej. \u00e9 para éForma universal — exactamente cuatro dígitos hexadecimales

Forma escapada en el archivo

"quote": "she said \"hi\""
"path": "C:\\Users\\ada"
"e-acute": "\u00e9"

Lo que devuelve un analizador

quote:   she said "hi"
path:    C:\Users\ada
e-acute: é

Números: ECMAScript, sin las extensiones

Un número es un entero o un decimal en notación llana, con un exponente opcional. RFC 8259 adopta la gramática de números de ECMAScript y elimina sus extensiones: nada de hexadecimal, nada de octal, nada de ceros a la izquierda, nada de signo más inicial, nada de punto final suelto. Un exponente usa e o E con un signo opcional, y el único signo con el que puede empezar un número es el guion simple. NaN, Infinity y -Infinity no son JSON — los lenguajes que tienen tales constantes escriben null en su lugar por convención.

La precisión se deja deliberadamente en manos de las implementaciones: la gramática no dice nada sobre cuántos dígitos debe honrar un analizador, así que números muy largos pueden llegar cambiados en silencio. Los generadores interoperables mantienen los enteros dentro del rango que la plataforma de destino representa exactamente — para los dobles IEEE 754 que hay detrás de JavaScript, hasta 2^53 − 1.

EscritoVeredictoPor qué
42, -17, 3.14VálidoFormas enteras y decimales llanas
2.1e10, 5E-3VálidoExponentes: e o E, con signo opcional después
01, -01InválidoLos ceros a la izquierda están prohibidos — escribe 1
1., .5, +6InválidoUn punto necesita dígitos a ambos lados; nada de signo más inicial
0x1F, 1_000InválidoEl hexadecimal y los separadores de dígitos son extensiones de JavaScript
NaN, InfinityInválidoNo forman parte de la gramática; JSON no tiene tales constantes
9007199254740993ArriesgadoSe analiza, pero excede el rango de enteros exactos de los dobles IEEE 754

Los tres literales y los cinco rechazos clásicos

Tres tokens en crudo completan el conjunto de valores: true, false y null. Van en minúsculas y sin comillas — True, FALSE y None son errores de sintaxis, no mayúsculas creativas. Alrededor de ellos, la gramática traza cinco líneas que explican casi todos los documentos rechazados que existen:

  • Sin comentarios. RFC 8259 no tiene sintaxis de comentarios; // o /* */ en cualquier lugar es un error de sintaxis. Anota con una clave hermana como "_comment" cuando el formato esté bajo tu control.
  • Sin comas finales. [1, 2, 3,] y {"a":1,} son inválidos, por amigables que parezcan — la coma es un separador, y no puede separar un elemento de nada.
  • Sin comillas simples ni claves sin comillas. {name:'ada'} es JSON inválido; {"name":"ada"} es la única grafía que permite la gramática.
  • Sin claves duplicadas — oficialmente. La gramática permite que un nombre aparezca dos veces, pero RFC 8259 §4 deja en manos de las implementaciones qué valor gana, así que un documento que dependa de duplicados no tiene significado definido.
  • Cualquier valor de nivel superior. Desde RFC 8259, un documento entero puede ser una cadena, un número, un booleano o un null en crudo — la regla de RFC 4627 de solo objetos y arrays desapareció, y "hello" o 42 son documentos JSON completos.

Codificación: UTF-8 y las reglas a nivel de bytes

RFC 8259 §8.1 fija la codificación de bytes: el texto JSON intercambiado entre sistemas que no forman parte de un ecosistema cerrado debe estar codificado en UTF-8. No existe JSON en UTF-16 o UTF-32 en la red abierta, y los generadores no deben anteponer una marca de orden de bytes — un analizador puede ignorar un BOM inicial en lugar de fallar, pero nada conforme emite uno. Fíjate en cómo se separan las capas: el escape \uXXXX es una elección de notación dentro de cadenas individuales, mientras que UTF-8 es una propiedad del documento completo, y las dos resuelven problemas distintos.

Con esto se cierra la gramática. La manera más rápida de fijar estas reglas es someter a ellas tus propios documentos — dale formato a una carga útil real, rompe una regla cada vez y lee cada error del validador. Diez minutos de fallo deliberado enseñan más que otra pasada por esta página.

Preguntas frecuentes

¿Puedo pegar datos reales de una API en las herramientas enlazadas desde esta página?

Sí. El formateador y el validador de este sitio se ejecutan enteramente en tu navegador: tu documento lo analiza JavaScript dentro de la pestaña, y no hay ningún paso de subida que auditar. Puedes comprobarlo tú mismo — el panel «Network» del navegador se queda callado mientras las herramientas trabajan, y la Content-Security-Policy del sitio bloquea las conexiones salientes, así que ni una copia modificada de la página podría transmitir tus datos.

¿JSON permite comillas simples para las cadenas?

No. RFC 8259 define las cadenas entre comillas dobles, tanto para claves como para valores, y no da ningún significado a las comillas simples — un analizador que se encuentre 'hello' falla de inmediato, mientras que "hello" es la única grafía válida. Las herramientas que leen comillas simples sin quejarse están analizando JSON5 u otro superconjunto, no JSON, razón por la que su salida aún puede ser rechazada por consumidores más estrictos.

¿Qué es exactamente una coma final y por qué es un error?

Es la posición, no el carácter. Una coma entre dos elementos es un separador; una coma justo delante de } o ] separaría un elemento de nada, y la gramática lo prohíbe. Es la razón más común por la que un archivo editado a mano falla la validación, y por eso los generadores, los minificadores y las herramientas de formato eliminan las comas finales por ti antes de escribir.

¿Por qué los números JSON no pueden tener ceros a la izquierda como 007?

Los ceros a la izquierda eran la forma de escribir literales octales (base 8) en el JavaScript antiguo, y RFC 8259 toma su gramática de números de ECMAScript con las extensiones octal y hexadecimal eliminadas — así que 007 se rechaza para que una grafía signifique un único valor. Escribe 7, y guarda identificadores como los códigos postales como cadenas siempre que un cero a la izquierda forme parte del valor.

¿Son legales las claves duplicadas en un objeto JSON?

La gramática permite que un nombre aparezca dos veces, pero el estándar se niega deliberadamente a definir el resultado: RFC 8259 señala que las implementaciones informan del último valor, del primero o de un error. Un documento cuyo significado dependa de duplicados no es, por tanto, JSON interoperable — trata los duplicados como un error incluso cuando tu analizador en particular resulta aceptarlos en silencio.

¿Hasta dónde puede crecer un número JSON antes de que se rompa la precisión?

La gramática no pone límite de dígitos, pero la mayoría de los analizadores descodifican en flotantes de doble precisión IEEE 754, que representan enteros con exactitud solo hasta 2^53 − 1. Un identificador de 17 dígitos como 9007199254740993 puede llegar alterado en silencio — la razón clásica por la que los SDK de APIs con ids de 64 bits te dicen que los trates como cadenas y no como números.

¿Dónde puedo leer las normas citadas aquí?

  • RFC 8259 — El formato de intercambio de datos JavaScript Object Notation (JSON)
  • ECMA-404 — La sintaxis de intercambio de datos JSON
  • RFC 4627 — El tipo de medio application/json para JavaScript Object Notation (JSON) (obsoleto; el estándar vigente de JSON es RFC 8259)