¿Qué es JSON?
JSON (JavaScript Object Notation) es un formato de intercambio de datos ligero, basado en texto, que resulta fácil de leer y escribir para los humanos, y sencillo de analizar y generar para las máquinas. Aunque deriva de la sintaxis de JavaScript, JSON es independiente del lenguaje: prácticamente todos los lenguajes de programación modernos cuentan con bibliotecas para analizarlo y producirlo.
JSON fue introducido por Douglas Crockford a principios de los años 2000 como una alternativa más simple a XML para el intercambio de datos en la web. Hoy en día, es el formato dominante en REST APIs, archivos de configuración, bases de datos como MongoDB y mucho más.
Sintaxis de JSON: El Panorama Completo
Un valor JSON es uno de los siguientes:
- Objeto:
{ "clave": valor, ... }— una colección desordenada de pares clave-valor - Array:
[ valor, ... ]— una lista ordenada de valores - Cadena de texto:
"hola mundo"— debe usar comillas dobles - Número:
42,3.14,-7,1.5e10— sin distinción entre entero y decimal - Booleano:
trueofalse - Nulo:
null
{
"nombre": "Alicia",
"edad": 30,
"activo": true,
"puntuaciones": [95, 87, 100],
"direccion": {
"ciudad": "Madrid",
"codigoPostal": "28001"
},
"notas": null
}
Errores de Sintaxis Comunes
| Error | Incorrecto | Correcto |
|---|---|---|
| Coma final | { "a": 1, } |
{ "a": 1 } |
| Comillas simples | { 'clave': 'val' } |
{ "clave": "val" } |
| Clave sin comillas | { clave: "val" } |
{ "clave": "val" } |
| Comentarios | { // comentario } |
(no soportado) |
| Undefined | { "a": undefined } |
Usar null u omitir la clave |
Una Breve Historia de JSON
- 2001: Douglas Crockford comienza a promover JSON como protocolo de comunicación sin estado entre servidor y navegador
- 2006: La IETF publica el RFC 4627, la primera especificación formal de JSON
- 2013: ECMA International formaliza JSON como ECMA-404
- 2017: El RFC 8259 reemplaza todos los anteriores y se convierte en el estándar definitivo
Antes de JSON, XML dominaba la comunicación entre APIs. La brevedad de JSON y su encaje natural con los objetos de JavaScript lo convirtieron en un éxito rotundo en la era Web 2.0, una tendencia que no ha hecho más que acelerarse.
Dónde se Usa JSON
REST APIs
Casi todas las REST APIs actuales devuelven JSON. Una petición a una API meteorológica podría devolver algo así:
{
"ubicacion": "Buenos Aires",
"temperatura": 22.4,
"unidad": "celsius",
"condiciones": ["nublado", "húmedo"],
"pronostico": [
{ "dia": "Lunes", "maxima": 24, "minima": 18 },
{ "dia": "Martes", "maxima": 21, "minima": 16 }
]
}
Archivos de Configuración
Herramientas como ESLint (.eslintrc.json), TypeScript (tsconfig.json) y npm (package.json) usan JSON para su configuración.
Bases de Datos NoSQL
MongoDB almacena documentos en BSON (JSON Binario). CouchDB, Firebase Firestore y DynamoDB utilizan modelos de documentos similares a JSON.
Almacenamiento Local y Cookies
El localStorage del navegador solo almacena cadenas de texto, por lo que los desarrolladores suelen usar JSON.stringify() antes de guardar y JSON.parse() al recuperar los datos.
Logging y Observabilidad
Los logs estructurados en JSON facilitan enormemente la consulta con herramientas como Elasticsearch, Datadog o Loki.
Análisis de JSON en la Práctica
JavaScript / TypeScript
// Convertir cadena a objeto
const datos = JSON.parse('{"nombre":"Alicia","edad":30}');
console.log(datos.nombre); // "Alicia"
// Serializar objeto a cadena
const json = JSON.stringify({ nombre: "Alicia", edad: 30 }, null, 2);
El argumento opcional null, 2 en JSON.stringify activa el formato legible con 2 espacios de indentación, lo cual es invaluable para depurar.
Python
import json
# Analizar
datos = json.loads('{"nombre": "Alicia", "edad": 30}')
print(datos["nombre"]) # Alicia
# Serializar
texto = json.dumps({"nombre": "Alicia", "edad": 30}, indent=2, ensure_ascii=False)
Go
import (
"encoding/json"
"fmt"
)
type Persona struct {
Nombre string `json:"nombre"`
Edad int `json:"edad"`
}
func main() {
var p Persona
json.Unmarshal([]byte(`{"nombre":"Alicia","edad":30}`), &p)
fmt.Println(p.Nombre)
}
Temas Avanzados
JSON Schema
JSON Schema es un vocabulario para validar la estructura de datos JSON. Permite definir campos requeridos, tipos de valores, patrones y restricciones:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"nombre": { "type": "string" },
"edad": { "type": "integer", "minimum": 0 }
},
"required": ["nombre", "edad"]
}
JSON Pointer (RFC 6901)
JSON Pointer proporciona una sintaxis de cadena para identificar un valor específico dentro de un documento JSON:
/nombre→ el camponombre/puntuaciones/0→ primer elemento del arraypuntuaciones
JSON Patch (RFC 6902)
JSON Patch define un formato para expresar una secuencia de operaciones a aplicar sobre un documento JSON, útil para actualizaciones incrementales en APIs.
Consideraciones de Rendimiento
- Tamaño: JSON es textual y verboso. Para sistemas de alto rendimiento, considera alternativas binarias como MessagePack o Protocol Buffers.
- Velocidad de análisis: Los parsers modernos (como simdjson) pueden analizar gigabytes por segundo, pero en la mayoría de las aplicaciones web el análisis de JSON no es un cuello de botella.
- Estructuras muy anidadas: El anidamiento profundo puede causar errores de desbordamiento de pila en parsers recursivos. Mantén las estructuras razonablemente planas cuando sea posible.
JSON vs XML vs YAML
| Característica | JSON | XML | YAML |
|---|---|---|---|
| Legibilidad | Buena | Verboso | Excelente |
| Comentarios | ❌ | ✅ | ✅ |
| Soporte binario | ❌ (requiere base64) | ❌ | ❌ |
| Validación de esquema | JSON Schema | XSD | ❌ (limitado) |
| Mejor para | APIs, config, almacenamiento | Documentos, legacy | Archivos de config |
Mejores Prácticas
- Valida en la entrada: Nunca confíes en el JSON que recibes. Valídalo siempre contra un esquema o comprueba los campos esperados.
- Usa
nullintencionalmente: Distingue entre "el campo no existe" y "el campo es explícitamente nulo". - Evita estructuras muy anidadas: Los datos planos son más fáciles de manejar. Usa IDs para vincular objetos relacionados.
- Nomenclatura de claves consistente: Elige una convención (camelCase, snake_case) y mantenla en toda tu API.
- Fechas como cadenas ISO 8601: JSON no tiene tipo fecha. Usa el formato
"2025-04-09T00:00:00Z"para garantizar la interoperabilidad. - Minifica en producción, formatea para depurar: Usa JSON compacto en respuestas de API para reducir el ancho de banda; usa formato legible en local.
Resumen
JSON se ha convertido en el lenguaje universal del intercambio de datos en la web con razón: es simple, legible y está soportado en todas partes. Entender su sintaxis, sus limitaciones y sus mejores prácticas te convertirá en un desarrollador más eficaz, ya sea construyendo APIs, escribiendo archivos de configuración o procesando pipelines de datos.