Formato JSON: Guía Técnica Completa
JSON (JavaScript Object Notation) es un formato de intercambio de datos ligero y basado en texto. Especificado en RFC 8259 (2017) y ECMA-404 (2ª edición, 2017), JSON se deriva de la sintaxis de literales de objetos de JavaScript pero es independiente del lenguaje — prácticamente todos los lenguajes de programación tienen bibliotecas de análisis y serialización JSON.
Gramática JSON
JSON define exactamente seis tipos de valor:
1. Cadena de texto (String)
Una secuencia de puntos de código Unicode entre comillas dobles. Escapes requeridos:
\"— comilla doble\\— barra invertida\n— nueva línea\t— tabulación horizontal\uXXXX— punto de código Unicode (4 dígitos hex)
Las comillas simples no son válidas en JSON.
2. Número (Number)
Enteros y números de punto flotante en notación decimal:
- Entero:
-123,0,42 - Decimal:
3.14,-0.5 - Científico:
1.23e10,2.5E-4
No hay valores especiales: NaN, Infinity y -Infinity no son JSON válido.
3. Booleano (Boolean)
Solo minúsculas: true o false.
4. Nulo (Null)
null (solo minúsculas). Representa la ausencia intencional de valor.
5. Array
Lista ordenada de valores: [valor, valor, ...]. Las comas finales no son válidas en JSON.
6. Objeto (Object)
Conjunto desordenado de pares clave/valor: {"clave": valor, "clave2": valor2}. Las claves deben ser cadenas (entre comillas dobles).
Ejemplo de Estructura JSON
{
"usuario": {
"id": 1234,
"nombre": "María García",
"email": "maria@ejemplo.com",
"activo": true,
"creado_en": "2024-01-15T09:30:00Z",
"puntuacion": 98.6,
"etiquetas": ["premium", "verificado"],
"direccion": null,
"preferencias": {
"tema": "oscuro",
"notificaciones": false,
"idioma": "es"
}
}
}
Procesamiento de JSON: Referencia de Lenguajes
# Python
import json
# Analizar cadena JSON a dict
datos = json.loads('{"nombre": "Alice", "edad": 30}')
print(datos["nombre"]) # Alice
# Analizar archivo JSON
with open("datos.json") as f:
datos = json.load(f)
# Serializar a cadena JSON
json_str = json.dumps(datos, indent=2, ensure_ascii=False)
# Escribir JSON en archivo
with open("salida.json", "w", encoding="utf-8") as f:
json.dump(datos, f, indent=2, ensure_ascii=False)
# jq — procesador JSON de línea de comandos
# Extraer un campo
jq '.usuario.nombre' datos.json
# Filtrar array
jq '.usuarios[] | select(.activo == true)' datos.json
# Transformar estructura
jq '{nombre: .usuario.nombre, id: .usuario.id}' datos.json
# Embellecer JSON minificado
jq '.' minificado.json
# Minificar JSON
jq -c '.' embellecido.json
# Contar elementos del array
jq '.elementos | length' datos.json
# Convertir JSON a CSV
jq -r '.[] | [.nombre, .precio, .categoria] | @csv' datos.json > salida.csv
JSON vs Otros Formatos de Datos
| Formato | Legible por humanos | Tamaño | Esquema | Comentarios | Mejor para |
|---|---|---|---|---|---|
| JSON | ✓ | Medio | JSON Schema | ✗ | APIs web, config |
| YAML | ✓ (verbose) | Pequeño | JSON Schema | ✓ | Archivos de config, DevOps |
| XML | ✓ (verbose) | Mayor | XSD | ✓ | Empresa, documentos |
| CSV | ✓ (tabular) | Menor | — | ✗ | Datos tabulares |
| MessagePack | ✗ | Menor binario | — | ✗ | APIs de alto rendimiento |
| Protocol Buffers | ✗ | Menor binario | Archivos .proto | ✗ | gRPC, microservicios |
Consideraciones de Seguridad
Inyección JSON: Nunca uses eval() para analizar JSON. Siempre usa JSON.parse().
Contaminación de prototipo: En JavaScript, JSON con clave __proto__ puede contaminar el prototipo de Object. Usa JSON.parse() que es seguro.
Precisión de números grandes: Los números JSON > 2^53 pierden precisión en IEEE 754 double. Para enteros grandes (IDs de Twitter, IDs snowflake), transmite como cadenas.
Referencias circulares: JSON.stringify() lanza error en referencias circulares. Usa un replacer o biblioteca como flatted.
Conversiones relacionadas
Conversiones de documento que siguen este tema: