¿Qué es JSON?
JSON (JavaScript Object Notation, Notación de Objetos de JavaScript) es un formato de intercambio de datos ligero y basado en texto derivado de la sintaxis de objetos literales de JavaScript. Definido por Douglas Crockford a principios de la década de 2000 y estandarizado como ECMA-404 (2013) y RFC 8259 (2017), JSON se ha convertido en el lenguaje universal de las APIs, los archivos de configuración y el intercambio de datos estructurados.
El atractivo de JSON es su simplicidad: tiene exactamente 6 tipos de datos, 2 tipos estructurales, y una gramática que cabe en una página — sin embargo puede representar estructuras de datos anidadas arbitrariamente complejas. Todos los lenguajes de programación modernos tienen análisis JSON incorporado.
Sintaxis JSON
Sistema de Tipos Completo
"cadena" ← cadena Unicode entrecomillada
42 ← número (entero o flotante)
3.14 ← número (punto flotante)
true ← booleano
false ← booleano
null ← nulo (ausencia de valor)
{"clave": "val"} ← objeto (pares clave-valor)
[1, 2, 3] ← array (lista ordenada)
Reglas de Gramática JSON
- Cadenas: Deben usar comillas dobles (no simples). Escapes de barra invertida:
\",\\,\n,\t,\uXXXX. - Números: Sin ceros iniciales. Sin coma decimal final. Sin valores especiales (Infinity, NaN no son JSON válido).
- Objetos: Las claves deben ser cadenas (entre comillas dobles). Pares separados por comas. Comas finales no permitidas.
- Sin comentarios: JSON no tiene sintaxis de comentarios.
Ejemplo JSON Bien Formado
{
"usuario": {
"id": 12345,
"nombre": "Juan García",
"email": "juan@ejemplo.com",
"edad": 34,
"premium": true,
"ultimoAcceso": null,
"roles": ["admin", "editor"],
"preferencias": {
"tema": "oscuro",
"notificaciones": false,
"idioma": "es-ES"
},
"puntuaciones": [98.5, 87.3, 92.1]
}
}
Validación con JSON Schema
JSON Schema (json-schema.org, Borrador 2020-12) define la estructura esperada de los documentos JSON:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Usuario",
"type": "object",
"required": ["id", "nombre", "email"],
"properties": {
"id": { "type": "integer", "minimum": 1 },
"nombre": { "type": "string", "minLength": 1, "maxLength": 100 },
"email": { "type": "string", "format": "email" },
"roles": {
"type": "array",
"items": { "enum": ["admin", "editor", "visor"] },
"uniqueItems": true
}
}
}
Validación en Código
import jsonschema, json
schema = json.load(open('usuario.schema.json'))
data = json.load(open('usuario.json'))
try:
jsonschema.validate(data, schema)
print("¡Válido!")
except jsonschema.ValidationError as e:
print(f"Inválido: {e.message}")
Variantes JSON
JSON5
JSON5 relaja la estrictez de JSON para archivos de configuración escritos por humanos:
- Comentarios de una línea y multilínea permitidos
- Comas finales en objetos y arrays
- Cadenas con comillas simples
- Claves de objetos sin comillas (si son identificadores válidos)
- Valores numéricos especiales (Infinity, NaN)
JSONC (JSON con Comentarios)
Subconjunto de JSON5 que solo añade soporte de comentarios (// y /* */). Usado por VS Code settings.json y tsconfig.json.
NDJSON / JSON Lines
JSON Delimitado por Saltos de Línea — un objeto JSON por línea, sin array envolvente:
{"id":1,"nombre":"Ana","puntuacion":95.5}
{"id":2,"nombre":"Juan","puntuacion":87.3}
{"id":3,"nombre":"María","puntuacion":92.1}
Ventajas: transmisible en streaming (procesa un registro a la vez), añadible, compatible con grep/awk línea a línea. Estándar para flujos de registros, importación masiva de Elasticsearch, pipelines ETL.
jq — El Procesador JSON de Línea de Comandos
jq es la herramienta esencial para manipulación JSON desde el terminal:
# Imprimir JSON con formato
cat datos.json | jq .
# Extraer un campo
jq '.usuario.nombre' datos.json
# Extraer de un array
jq '.[0].nombre' usuarios.json # primer elemento
jq '.[] | .nombre' usuarios.json # todos los nombres
# Filtrar
jq '.[] | select(.edad > 30)' usuarios.json
# Transformar (crear nuevo objeto)
jq '.[] | {nombre: .nombre, email: .email}' usuarios.json
# Contar elementos
jq '. | length' array.json
# Salida como CSV
jq -r '.[] | [.id, .nombre, .puntuacion] | @csv' usuarios.json
Conversión de JSON
JSON a CSV
import json, csv
with open('usuarios.json') as f:
datos = json.load(f)
with open('usuarios.csv', 'w', newline='', encoding='utf-8') as f:
escritor = csv.DictWriter(f, fieldnames=datos[0].keys())
escritor.writeheader()
escritor.writerows(datos)
# Miller (mlr)
mlr --ijson --ocsv cat datos.json > datos.csv
JSON a YAML
import json, yaml
with open('datos.json') as f:
datos = json.load(f)
with open('datos.yaml', 'w') as f:
yaml.dump(datos, f, default_flow_style=False, allow_unicode=True)
JSON a Parquet (para análisis)
import pandas as pd
df = pd.read_json('datos.json')
df.to_parquet('datos.parquet', index=False, compression='snappy')
JSON vs XML vs YAML
| Característica | JSON | XML | YAML |
|---|---|---|---|
| Legibilidad humana | Buena | Pobre (verboso) | Excelente |
| Comentarios | No | Sí | Sí |
| Tipos de datos | 6 tipos | Solo cadenas | Rico (fechas, binario, etc.) |
| Esquemas | JSON Schema | XSD, DTD | (ninguno estándar) |
| Tamaño (mismos datos) | El menor | 30–50% mayor | Similar a JSON |
| Estándar de API | Casi universal | APIs legadas | Archivos de configuración |
| Mejor para | APIs, datos web | XML empresarial | Configuración |
Consideraciones de Rendimiento JSON
Para archivos muy grandes (>100MB):
- Analizadores de streaming:
ijson(Python),stream-json(Node.js) — procesa sin cargar todo en memoria - Alternativas JSON binarias: BSON (MongoDB), MessagePack, CBOR — más rápidos pero no legibles por humanos
- Alternativas columnares: Convierte grandes arrays JSON a Parquet para cargas de trabajo analíticas
La combinación de simplicidad, universalidad y estructura autodescriptiva de JSON lo ha convertido en el formato de datos dominante para APIs web, configuración e intercambio de datos — un estatus que parece seguro para el futuro previsible.
Conversiones relacionadas
Conversiones de documento que siguen este tema: