JSON tiene exactamente seis tipos de valor: cadena, numero, booleano, nulo, arreglo y objeto. Nada en la especificacion agrega un septimo. Esa lista corta es facil de enunciar y sorprendentemente facil de equivocar en la practica, mayormente en los limites que cada tipo tiene y que los tipos nativos de un lenguaje no comparten.
Cadena
Texto entre comillas dobles, nunca comillas simples. 'hello' no es JSON
valido, solo "hello" lo es. Un puñado de caracteres necesitan escaping dentro de una cadena:
la propia comilla (\"), una barra invertida (\\), y los caracteres de control
\n, \r, \t, \b y \f. Cualquier otra cosa, incluyendo la mayor parte del texto Unicode,
puede escribirse sin escaping siempre que el archivo sea UTF-8 valido. JSON Escape
and Unescape realiza la conversion en ambas
direcciones y reporta exactamente que character fallo en una secuencia de escape
mal formada, en vez de un error de analisis generico.
Numero
Un solo tipo numerico, no tipos enteros y de punto flotante separados como en algunos
lenguajes. Un numero JSON es una secuencia de digitos, un punto decimal
opcional, y un exponente opcional: 42, -3.14, 2.5e10. Sin hexadecimal, sin
Infinity, sin NaN, y sin cero a la izquierda antes de un digito distinto de cero (0123 es
invalido, 0.123 esta bien). El limite mas delicado aqui: el tipo Number
de JavaScript es un float de 64 bits, que no puede representar exactamente cada entero mayor a unos 2^53
(nueve mil billones aproximadamente). Si analizas un documento JSON que contiene un
ID de base de datos de 64 bits o un Snowflake ID con JSON.parse en la consola de un navegador,
los ultimos digitos pueden redondearse, sin avisar. El JSON
Formatter de este sitio esta construido sobre un flujo de
tokens en vez de JSON.parse especificamente para que un entero de veinte digitos
sobreviva el viaje de ida y vuelta sin redondeo, y reporta los numeros que no pudo
representar con seguridad en vez de redondear sin decir nada.
Booleano
Exactamente dos valores literales, en minusculas, sin comillas: true y false.
"true" es una cadena, no un booleano, y una fuente comun de errores cuando un
campo que deberia ser booleano se serializa como texto en algun lugar aguas arriba.
Nulo
Un valor literal, en minuscula, sin comillas: null. Representa la ausencia
deliberada de un valor, que es algo distinto a una clave que falta por completo.
{"middleName": null} dice “esta persona no tiene segundo nombre, y
lo verificamos.” Un documento sin la clave middleName en absoluto no dice nada sobre
si uno existe. Las APIs que mezclan ambos conceptos (usando una clave faltante y un
valor nulo de forma intercambiable) hacen que esa distincion sea imposible de recuperar
del lado receptor.
Arreglo
Una lista ordenada, [ ], separada por comas, con elementos de cualquier tipo incluyendo
tipos mezclados en el mismo arreglo: [1, "two", true, null] es JSON valido aunque
seria una eleccion de esquema peculiar. El orden esta garantizado y
es significativo; dos arreglos con los mismos elementos en un orden diferente son
valores diferentes.
Objeto
Un conjunto no ordenado de pares clave-valor, { }, donde las claves siempre son cadenas (incluso una
clave con apariencia numerica como "2" es una cadena, no un numero), y los valores pueden ser de cualquier tipo.
Dos claves con el mismo nombre dentro de un objeto no estan prohibidas por la
gramatica, aunque la especificacion describe el comportamiento como “no recomendado” y
deja lo que sucede despues en manos del analizador; la mayoria de las implementaciones, incluyendo
JSON.parse, conservan silenciosamente la ultima y descartan las anteriores. El
JSON Validator senala una clave duplicada como una
advertencia en vez de dejar pasar un documento que contenga una silenciosamente, ya que cual
valor sobrevive es el tipo de cosa que deberia ser una decision explicita.
Lo que ninguno de los seis tipos puede contener
Sin tipo de fecha: una marca de tiempo es una cadena, casi siempre en formato ISO 8601
("2026-08-24T10:00:00Z"), por convencion mas que por algo que JSON
imponga. Sin undefined: una clave que seria undefined en
JavaScript se omite del objeto en vez de escribirse con ese valor,
ya que JSON no tiene ningun literal para eso. Sin funciones, sin Map ni Set,
sin comentarios en ningun lugar del documento. Un formato que necesite cualquiera de esos
(comentarios en linea en configuraciones, por ejemplo) esta eligiendo un formato
diferente a proposito, no una extension de JSON; consulta JSON vs YAML
para ver el compromiso que el soporte de comentarios y otras comodidades implican.
Probandolo
Pega cualquier documento en el JSON Viewer y cada valor recibe su propio color y etiqueta en el arbol, lo cual es una forma rapida de ver exactamente como esta tipado un documento sin leer el texto crudo caracter por caracter. Para ver las reglas de sintaxis de un vistazo, consulta la JSON Cheat Sheet.