En la vida real, los datos que manejan las aplicaciones rara vez son simples. Por ejemplo:
👉 Para representar estas relaciones, las APIs REST usan JSON anidado y estructuras complejas.
Un JSON anidado es aquel donde un valor de un objeto no es solo un número o texto, sino otro objeto o un arreglo de objetos.
Ejemplo básico (usuario con dirección)
{
"id": 1,
"nombre": "Carlos",
"email": "carlos@ejemplo.com",
"direccion": {
"calle": "Av. Colón",
"numero": 1234,
"ciudad": "Córdoba",
"pais": "Argentina"
}
}
👉 Aquí el campo direccion
es un objeto JSON anidado dentro del usuario.
Muchas veces un recurso está compuesto por una lista de objetos.
Ejemplo (usuario con múltiples teléfonos)
{
"id": 1,
"nombre": "Ana",
"telefonos": [
{ "tipo": "móvil", "numero": "3511234567" },
{ "tipo": "fijo", "numero": "3517654321" }
]
}
👉 El campo telefonos
es un arreglo de objetos, cada uno con tipo
y numero
.
Supongamos una API de pedidos en un e‑commerce.
Petición (crear un pedido)
POST /pedidos
Content-Type: application/json
Accept: application/json
{
"usuario": {
"id": 5,
"nombre": "Laura"
},
"productos": [
{ "id": 101, "nombre": "Notebook", "precio": 1500.0, "cantidad": 1 },
{ "id": 202, "nombre": "Mouse inalámbrico", "precio": 25.0, "cantidad": 2 }
],
"direccion_envio": {
"calle": "San Martín",
"numero": 500,
"ciudad": "Córdoba",
"pais": "Argentina"
},
"estado": "pendiente"
}
Respuesta del servidor
{
"pedido_id": 9001,
"usuario": { "id": 5, "nombre": "Laura" },
"productos": [
{ "id": 101, "nombre": "Notebook", "precio": 1500.0, "cantidad": 1, "subtotal": 1500.0 },
{ "id": 202, "nombre": "Mouse inalámbrico", "precio": 25.0, "cantidad": 2, "subtotal": 50.0 }
],
"total": 1550.0,
"direccion_envio": {
"calle": "San Martín",
"numero": 500,
"ciudad": "Córdoba",
"pais": "Argentina"
},
"estado": "pendiente",
"fecha_creacion": "2025-09-10T12:30:00Z"
}
👉 Aquí tenemos: un objeto usuario
, un arreglo de objetos productos
, otro objeto direccion_envio
y atributos simples como total
y estado
.
import requests # https://requests.readthedocs.io/
resp = requests.get("https://api.ejemplo.com/pedidos/9001")
pedido = resp.json()
print("Pedido ID:", pedido["pedido_id"])
print("Usuario:", pedido["usuario"]["nombre"])
for prod in pedido["productos"]:
print(" -", prod["nombre"], "x", prod["cantidad"], "=", prod["subtotal"])
👉 Se accede a objetos anidados con ["campo"]
y a listas con for
. Librería requests.
fetch("https://api.ejemplo.com/pedidos/9001") // API fetch: https://developer.mozilla.org/docs/Web/API/fetch
.then(res => res.json())
.then(pedido => {
console.log("Pedido ID:", pedido.pedido_id);
console.log("Usuario:", pedido.usuario.nombre);
pedido.productos.forEach(p => {
console.log(` - ${p.nombre} x${p.cantidad} = ${p.subtotal}`);
});
})
.catch(err => console.error("Error:", err));
👉 En JavaScript es muy natural manejar estructuras anidadas, porque JSON proviene de JavaScript y el API fetch lo convierte fácilmente.
productos
debería ser siempre un arreglo, aunque tenga 1 solo elemento.Los JSON anidados permiten representar relaciones entre entidades (usuarios con direcciones, pedidos con productos, etc.). Son indispensables en APIs REST reales porque los datos del mundo real son jerárquicos y relacionados.
Es fundamental consumirlos correctamente en el cliente y mantener buenas prácticas de diseño.
👉 En resumen: JSON anidado es la forma en que REST modela la complejidad del mundo real.