4.3. Ejemplo con librería (Axios)
En este apartado vamos a ver cómo procesar un JSON utilizando una librería externa, en concreto Axios, para simplificar la carga y el manejo de errores.
Trabajaremos con el dataset de instituciones bibliotecarias de Castilla y León en formato JSON.
📦 Cómo incluir la librería
En este curso usaremos CDN (no hace falta npm). Inserta el script en tu HTML antes de tu código:
<script src="https://cdn.jsdelivr.net/npm/axios@1.7.7/dist/axios.min.js" integrity="" crossorigin="anonymous"></script>
<script type="module" src="main.js"></script>
Si más adelante empaquetas con Vite/Webpack, podrás import axios from "axios" sin cambiar el resto del código.
📌 Flujo de trabajo con librería
- Incluir Axios desde CDN.
- Hacer la solicitud con
axios.get(url). - Recibir los datos desde
response.data(ya parseados). - Comprobar la estructura (array u objeto).
- Mapear a un modelo de columnas útil para la interfaz.
- Renderizar la información en una tabla simple.
- Gestionar errores (red, timeout) y, si hace falta, cancelar la petición.
🧩 Código paso a paso
1) Cargar el JSON con Axios
// datasets/json/registro-de-instituciones-bibliotecarias-de-castilla-y-leon.json
const URL_JSON = "datasets/json/registro-de-instituciones-bibliotecarias-de-castilla-y-leon.json";
async function cargarJSON() {
try {
const { data } = await axios.get(URL_JSON, {
headers: { Accept: "application/json" },
timeout: 8000 // ms
});
return data;
} catch (err) {
// Manejo de errores típico con Axios
if (axios.isAxiosError(err)) {
console.error("Axios error:", err.message, "status:", err.response?.status);
} else {
console.error("Error desconocido:", err);
}
throw err;
}
}
2) Detectar la forma del dataset y quedarnos con la lista
El fichero real de bibliotecas es un array de objetos. Por eso comprobamos si data ya es un array; si no, intentamos localizar la clave lista (por ejemplo, instituciones en otros JSON).
function obtenerListaInstituciones(data) {
if (Array.isArray(data)) return data;
// fallback genérico si viniera envuelto en un objeto
return data?.instituciones ?? [];
}
3) Mapear a un modelo de columnas útil
Seleccionamos las claves que queramos mostrar en la tabla (tú puedes cambiar/añadir):
function aFilasTabla(instituciones) {
return instituciones.map(i => ({
nombreentidad: i.nombreentidad ?? "",
localidad: i.localidad ?? "",
tipo_de_gestion: i.tipo_de_gestion ?? "",
codigo: i.codigo ?? "",
enlace_al_contenido: i.enlace_al_contenido ?? ""
}));
}
4) Renderizar una tabla HTML sencilla
function renderTabla(datos, columnas, destino = document.body) {
const tabla = document.createElement("table");
// cabecera
const thead = document.createElement("thead");
const trH = document.createElement("tr");
columnas.forEach(col => {
const th = document.createElement("th");
th.scope = "col";
th.textContent = col;
trH.appendChild(th);
});
thead.appendChild(trH);
tabla.appendChild(thead);
// filas
const tbody = document.createElement("tbody");
datos.forEach(fila => {
const tr = document.createElement("tr");
columnas.forEach(col => {
const td = document.createElement("td");
td.textContent = fila[col] ?? "";
tr.appendChild(td);
});
tbody.appendChild(tr);
});
tabla.appendChild(tbody);
destino.appendChild(tabla);
}
5) Ponerlo todo junto
(async () => {
const data = await cargarJSON();
const instituciones = obtenerListaInstituciones(data);
const filas = aFilasTabla(instituciones);
renderTabla(filas, ["nombreentidad", "localidad", "tipo_de_gestion", "codigo", "enlace_al_contenido"]);
})();
(Opcional) Cancelar una petición con AbortController
Axios 1.x soporta AbortController (útil si el usuario cambia de vista):
const controller = new AbortController();
const peticion = axios.get(URL_JSON, { signal: controller.signal });
// … si necesitas abortar:
controller.abort();
Consejo
En MkDocs (o cualquier servidor estático), usa siempre un servidor local (mkdocs serve, Live Server…).
Si abres el HTML con file://, el navegador puede bloquear la lectura del JSON.
Revisa en DevTools → Network que la ruta relativa a datasets/json/... es la correcta.
⚖️ Comparación con el enfoque vanilla
| Aspecto | Vanilla (fetch + .json()) |
Con librería (Axios) |
|---|---|---|
| Parseo | Manual (res.json()) |
Automático en response.data |
| Errores | try/catch + comprobar res.ok |
try/catch + axios.isAxiosError, códigos de estado accesibles |
| Timeouts | Hay que implementar señal/abort manual | Opción timeout nativa |
| Cancelación | AbortController con fetch |
AbortController soportado ({ signal }) |
| Cabeceras por defecto | Debes pasarlas tú (opcional) | Incluye cabeceras sensatas; fácil añadir headers |
| Interceptores / logging | A mano en cada llamada | Interceptores globales (axios.interceptors) |
| Tamaño de código repetitivo | Algo más de “pegamento” por cada endpoint | Menos repetición; configuración común y defaults |
| Dependencias | Ninguna | 1 dependencia (ligera) |
| Curva de aprendizaje | Muy baja | Muy baja (si sabes fetch, te resultará familiar) |
📝 Preguntas de repaso
Repaso
- ¿Qué diferencia hay entre
response.json()en vanilla yresponse.dataen Axios? - ¿Cómo comprobarías si el dataset viene como array o dentro de una clave (ej.
instituciones)? - ¿Qué ventajas aporta
timeouten Axios frente a fetch puro? - ¿Cómo cancelarías una petición en curso con Axios?
- ¿Qué columnas has decidido mostrar y por qué?