JSON

13 tools

¿Qué es JSON?

JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos, basado en texto, fácil de leer y escribir para los humanos y fácil de analizar y generar para las máquinas. Aunque se deriva de JavaScript, JSON es independiente del lenguaje y es ahora el estándar de facto para el intercambio de datos en la web.

JSON representa datos como pares clave-valor organizados en objetos y arrays. Su simplicidad lo convirtió en el formato dominante para APIs REST, archivos de configuración y almacenamiento de datos, sustituyendo al más verboso XML en la mayoría de las aplicaciones modernas.

Una breve historia

JSON fue formalizado por Douglas Crockford a principios de los años 2000, aunque el formato ya era implícito en la sintaxis de JavaScript. La especificación se publicó en json.org en 2001. El RFC 4627 siguió en 2006, y el actual estándar ECMA-404 se publicó en 2013.

Antes de JSON, XML era el formato de intercambio de datos dominante en la web. El minimalismo de JSON —sin atributos, instrucciones de procesamiento ni espacios de nombres— lo hizo inmediatamente popular entre los desarrolladores. Para 2010, JSON había desplazado en gran medida a XML en las APIs web.

Tipos de datos JSON

JSON admite exactamente seis tipos de datos. Cada valor en un documento JSON válido debe ser uno de estos:

String"hello world"

Cualquier secuencia de caracteres Unicode entre comillas dobles. Se admiten secuencias de escape con barra invertida (\n, \t, \").

Number42 / 3.14 / 1e10

Entero o de punto flotante. Se permite notación científica (1e10). No hay distinción entre int y float a nivel JSON.

Booleantrue / false

Los tokens literales true o false (solo en minúsculas). No hay valores verdaderos/falsos — solo booleano estricto.

Nullnull

El token literal null (en minúsculas). Representa la ausencia de valor. Diferente de undefined, que no es un tipo JSON.

Array[1, "two", null]

Una lista ordenada de valores entre corchetes. Los elementos pueden ser de tipos mixtos y los arrays pueden anidarse arbitrariamente.

Object{"key": "value"}

Una colección no ordenada de pares clave-valor entre llaves. Las claves deben ser cadenas. Los valores pueden ser cualquier tipo JSON.

{
  "string":  "hello world",
  "number":  42,
  "float":   3.14,
  "boolean": true,
  "null":    null,
  "array":   [1, 2, 3],
  "object":  { "nested": "value" }
}

Reglas de sintaxis JSON

JSON tiene reglas de sintaxis estrictas. Una pequeña desviación causa un error de análisis. Estas son las seis reglas más importantes:

Solo cadenas con comillas dobles

Todos los valores de cadena y las claves de objeto deben usar comillas dobles. Las comillas simples no son JSON válido. Este es el error más común entre desarrolladores que vienen de JavaScript.

Sin comas finales

JSON no permite comas finales después del último elemento en un array o la última propiedad en un objeto. [1, 2, 3,] y {"a": 1,} son ambos inválidos.

Sin comentarios

JSON no tiene sintaxis de comentarios. // y /* */ no son válidos. Si necesitas comentarios en archivos de configuración, considera JSON5 o YAML.

Sin undefined ni funciones

JSON solo admite seis tipos primitivos. Los valores de JavaScript como undefined, NaN, Infinity y las funciones no pueden representarse y se omiten o convierten a null durante la serialización.

Las claves de objeto deben ser cadenas

Todas las claves de objeto deben ser cadenas entre comillas. No se permiten claves numéricas, identificadores sin comillas ni otros tipos.

Literales sensibles a mayúsculas

JSON es sensible a mayúsculas y minúsculas. true, false y null deben estar en minúsculas. TRUE, False o Null son tokens inválidos.

JSON inválido vs. válido

Inválido
{
  'name': 'Alice',       // single quotes — invalid
  age: 30,              // unquoted key — invalid
  "scores": [1, 2, 3,], // trailing comma — invalid
  "note": undefined     // undefined — invalid
}
Válido
{
  "name": "Alice",
  "age": 30,
  "scores": [1, 2, 3],
  "note": null
}

JSON en la web moderna

APIs REST

JSON es el formato de cuerpo estándar para solicitudes y respuestas de API REST. Content-Type: application/json es el tipo MIME más común en la web moderna. Prácticamente todos los lenguajes de programación tienen un analizador JSON integrado.

Archivos de configuración

package.json, tsconfig.json, .eslintrc y muchas otras herramientas de desarrollo usan JSON para la configuración. El formato estructurado y el soporte universal de analizadores lo hacen práctico, aunque la falta de comentarios es una crítica persistente.

Bases de datos NoSQL

Las bases de datos de documentos como MongoDB, CouchDB y Amazon DynamoDB almacenan datos como documentos JSON o similares. Esto permite almacenamiento flexible sin esquema que se mapea naturalmente a los objetos de la aplicación.

Estado y datos del frontend

localStorage y sessionStorage almacenan cadenas, por lo que JSON.stringify/JSON.parse se usan constantemente para serializar objetos JavaScript. Las respuestas de API de fetch() llegan como texto JSON y se analizan antes de usarse.

JSON vs. otros formatos

JSON no siempre es la mejor opción. Así es como se compara con otros formatos de datos comunes:

JSON vs XML
Ventajas de JSON sobre XML

Sintaxis más simple, menor tamaño de archivo, más fácil de analizar, más legible

Desventajas de JSON vs XML

Sin soporte para atributos, instrucciones de procesamiento o espacios de nombres XML

Elige XML cuando

Necesitas metadatos de documento, modelos de contenido mixto o esquemas XML

JSON vs YAML
Ventajas de JSON sobre YAML

Sintaxis más estricta (menos ambigüedad), mejor soporte de herramientas, más portable

Desventajas de JSON vs YAML

Sin soporte de comentarios, ligeramente más verboso para datos muy anidados

Elige YAML cuando

Archivos de configuración editados por humanos, Docker Compose, GitHub Actions, manifiestos de Kubernetes

JSON vs TOML
Ventajas de JSON sobre TOML

Mayor soporte de ecosistema, análisis más rápido, manejo de tipos más predecible

Desventajas de JSON vs TOML

Sin tipo de fecha nativo, menos amigable para estructuras anidadas complejas

Elige TOML cuando

Rust (Cargo.toml), Python (pyproject.toml), configuración de aplicaciones estilo INI

JSON vs CSV
Ventajas de JSON sobre CSV

Datos estructurados y anidados, no limitado a filas y columnas planas

Desventajas de JSON vs CSV

Tamaño de archivo mucho mayor, peor rendimiento para datos puramente tabulares

Elige CSV cuando

Datos de hoja de cálculo, exportaciones de bases de datos, datos para abrir en Excel o pandas

JSON Schema

JSON Schema es un vocabulario para validar la estructura de documentos JSON. Un esquema describe los tipos esperados, los campos requeridos y las restricciones de un valor JSON. La versión actual es JSON Schema 2020-12.

Herramientas como ajv (JavaScript), jsonschema (Python) y validadores integrados en muchos IDEs admiten JSON Schema. OpenAPI usa JSON Schema para describir los cuerpos de solicitudes y respuestas de API.

Errores comunes con JSON

Pérdida de precisión numérica

Los números JSON se analizan como flotantes de doble precisión IEEE 754. Los enteros mayores que 2^53 pierden precisión. Pasa IDs grandes como cadenas, no como números.

Sin tipo de fecha

JSON no tiene tipo de fecha. Las fechas se serializan típicamente como cadenas ISO 8601 o timestamps Unix. Tu código debe conocer la convención usada.

Las referencias circulares colapsan los serializadores

JSON.stringify lanza un TypeError en referencias de objeto circulares. Necesitas romper el ciclo o usar una biblioteca que lo maneje.

Problemas de Unicode y BOM

JSON debe codificarse como UTF-8, UTF-16 o UTF-32. Un Byte Order Mark (BOM) al inicio de un archivo JSON no es compatible con la especificación.

Contaminación de prototipo

Al analizar JSON no confiable, fusionar objetos analizados puede ser vulnerable a ataques de contaminación de prototipo mediante la clave __proto__. Valida siempre el JSON de fuentes externas.

Null vs. clave faltante

{"key": null} y una "key" faltante son semánticamente diferentes. Null significa que el campo existe con un valor ausente; faltante significa que el campo no se especificó.

Preguntas frecuentes

¿Qué significa JSON?

JSON significa JavaScript Object Notation. A pesar del nombre, JSON es completamente independiente del lenguaje y es compatible con prácticamente todos los lenguajes de programación.

¿Es JSON lo mismo que un objeto JavaScript?

No. JSON es un formato de texto que se parece a un literal de objeto JavaScript, pero tiene reglas más estrictas: las claves deben estar entre comillas dobles y no admite undefined, funciones ni comentarios.

¿Puede JSON tener comentarios?

No. La especificación JSON no incluye sintaxis de comentarios. Para archivos de configuración que necesitan comentarios, considera JSONC, JSON5 o YAML.

¿Cuál es la diferencia entre JSON y JSONP?

JSONP (JSON con Padding) fue una solución para la política del mismo origen del navegador que envolvía JSON en una llamada de función. Es obsoleto — usa CORS en su lugar.

¿Cómo imprimo JSON de forma legible?

En JavaScript: JSON.stringify(data, null, 2) agrega sangría de 2 espacios. En Python: json.dumps(data, indent=2). En la terminal: cat file.json | python3 -m json.tool o cat file.json | jq .

¿Qué es NDJSON o JSON Lines?

NDJSON (Newline Delimited JSON) almacena un objeto JSON por línea. Es popular para archivos de registro, flujos de eventos y exportaciones de datos grandes.

¿Importa el espacio en blanco en JSON?

El espacio en blanco entre tokens es insignificante. {"a":1} y { "a" : 1 } son idénticos. El formato es una cuestión de estilo, no de semántica.

¿Cuál es el tamaño máximo de un archivo JSON?

La especificación JSON no establece límite de tamaño. En la práctica, estás limitado por la memoria del analizador y la transferencia de red.

¿Puede JSON representar datos binarios?

No directamente. Los datos binarios deben codificarse en Base64 antes de incluirse en JSON, lo que aumenta el tamaño en ~33%.

¿Qué es JSON5?

JSON5 es un superconjunto de JSON que agrega: claves sin comillas, cadenas con comillas simples, comas finales, comentarios y cadenas multilínea. Requiere un analizador separado.