Ir al contenido principal
CuteJSON
↑↓ Navegar Enter Seleccionar Esc Cerrar

Tipos de datos JSON explicados, con los casos extremos que rompen analizadores

Publicado 4 min de lectura Por Akash Kinkar Pandey

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.

Volver a todas las entradas