====== 03 - Formatos de datos y de configuración ======
**Markdown**, **JSON**, **XML**, **YAML** y **TOML** son formatos de **texto plano** con estructura definida. Cada uno ocupa un papel distinto: documentación, intercambio de datos con APIs, configuración de herramientas o configuración local con variables de entorno. La pregunta no es «cuál es mejor», sino **qué se guarda en cada uno**:
@startuml
start
if (¿documentación con formato?) then (sí)
:**Markdown**;
elseif (¿datos entre aplicaciones?) then (sí)
:**JSON**;
elseif (¿fichero de configuración?) then (sí)
:**XML**, **YAML** o **TOML**;
else (no)
:**variables de entorno** y ''.env'';
endif
stop
@enduml
===== 1. Markdown =====
**Markdown** es un lenguaje de marcas ligero para escribir texto con formato desde un editor cualquiera; se convierte a HTML para presentarlo. Se usa en ''README.md'', documentación técnica, PR de GitHub y ficheros como ''AGENTS.md'':
# Título 1
## Título 2
Párrafo con **negrita**, *cursiva* y `código en línea`.
- Elemento de lista
1. Primer paso
[Enlace](https://example.com)

> Cita destacada
| Comando | Acción |
|---------|--------|
| `git status` | Estado de los archivos |
```java
public class Main { }
```
* Las **triples comillas** delimitan bloques de código; indicar el lenguaje activa el resaltado de sintaxis.
* Los encabezados definen la jerarquía del documento: ''#'' para el título principal, ''##'' debajo, ''###'' más abajo.
===== 2. JSON =====
**JSON** (*JavaScript Object Notation*) es el formato estándar para **intercambiar información estructurada** entre aplicaciones, sobre todo en las **APIs REST**: el cliente envía JSON y recibe JSON. También sirve como fichero de configuración del ecosistema JavaScript (''package.json'', ''tsconfig.json''):
{
"id": 42,
"title": "Código limpio",
"available": true,
"authors": ["Robert C. Martin"],
"price": null,
"publisher": { "name": "Anaya" }
}
^ Elemento ^ Sintaxis ^
| Objeto | ''{ "clave": valor }'' |
| Array | ''[valor, valor]'' |
| Clave | siempre cadena entre comillas dobles |
| Valores | cadena, número, ''true''/''false'', ''null'', objeto, array |
Los valores se anidan: un array de objetos, un objeto dentro de otro. Desde TypeScript, ''JSON.parse(texto)'' convierte texto JSON en objeto y ''JSON.stringify(objeto)'' al revés; ''response.json()'' ya lo aplica al cuerpo de una respuesta (tema 07). JSON **no admite comentarios** ni fechas como tipo nativo (se representan como texto ISO: ''"2026-10-12"'').
===== 3. XML =====
**XML** (*eXtensible Markup Language*) describe documentos y **ficheros de configuración** con estructura jerárquica: ''pom.xml'' de Maven, ''web.xml'' de Tomcat o la configuración de frameworks:
Código limpio
craft
^ Elemento ^ Sintaxis ^
| Prólogo | '''' |
| Elemento | etiqueta de apertura y cierre: ''...'' |
| Atributo | dato en la etiqueta de apertura: ''id="42"'' |
| Elemento vacío | '''' |
| Comentario | '''' |
Los **espacios de nombres** (''xmlns'') agrupan vocabularios para que etiquetas del mismo nombre no colisionen, como se ve en ''web.xml''.
Un documento **bien formado** cumple las reglas sintácticas: un único elemento raíz, etiquetas cerradas y correctamente anidadas. La **validación** comprueba además que el documento respeta una estructura acordada; se define con **XSD** (XML Schema), que aporta tipos de datos y obligatoriedad:
Con ese esquema, un '''' con ''id'' no numérico no es válido.
===== 4. YAML =====
**YAML** es un formato de configuración sin etiquetas: la **indentación** define la estructura con pares ''clave: valor''. Es el formato de Docker Compose, GitHub Actions y Kubernetes:
# compose.yaml
services:
db:
image: mariadb:11
ports:
- "3306:3306"
environment:
MARIADB_ROOT_PASSWORD: ${DB_PASSWORD}
web:
build: .
depends_on:
- db
^ Estructura ^ Sintaxis ^
| Mapa | pares ''clave: valor'' anidados por indentación |
| Lista | elementos con ''-'' al mismo nivel |
| Texto | comillas solo cuando el valor es ambiguo |
| Comentario | ''#'' al inicio de línea |
La sustitución ''${DB_PASSWORD}'' toma el valor de la variable de entorno definida en el ''.env'' (apartado 6).
Las tabulaciones están prohibidas: solo espacios. Y los valores ambiguos van entre comillas: ''version: "3.8"'' (si no, se lee como número ''3.8'') o ''enabled: "yes"'' (si no, se convierte en booleano).
===== 5. TOML =====
**TOML** organiza la configuración en **secciones** con ''clave = valor''; los tipos básicos (texto, número, booleano, array) son nativos. Es el formato de ''pyproject.toml'' de Python y ''Cargo.toml'' de Rust:
[project]
name = "biblioteca"
version = "1.0.0"
tags = ["novela", "ensayo"]
[build]
target = "dist"
* ''[sección]'' agrupa las claves hasta la siguiente sección.
* ''[[..:elementos]]'' repite una sección para representar listas de objetos.
===== 6. Variables de entorno y .env =====
La configuración que **cambia por máquina** (puertos, rutas de base de datos, claves de API) no se escribe en el código ni se sube al repositorio: se lee de las **variables de entorno**. Durante el desarrollo se declaran en un ''.env'':
# .env
PORT=3000
DATABASE_URL=mariadb://app:contrasenya@localhost:3306/library
* Una línea por variable con el formato ''CLAVE=VALOR''; los comentarios con ''#''.
* Las herramientas cargan el ''.env'' al arrancar la aplicación: **dotenv** en **Node**; en Docker Compose el propio fichero alimenta las sustituciones ''${VAR}'', y en **Spring** las variables de entorno alimentan el ''application.properties''.
* El código las consulta en ejecución: ''process.env.PORT'' en **Node**, ''System.getenv("PORT")'' en Java, ''os.environ'' en Python.
Al repositorio solo se sube un ''.env.example'' con los nombres de las variables y sin valores, para que cada máquina cree su ''.env'' propio.
El ''.env'' nunca se sube al repositorio: contiene claves y contraseñas. Se añade a ''.gitignore'' y se publica el ''.env.example'' equivalente.
===== 7. Comparativa =====
^ Formato ^ Guarda ^ Aparece en ^
| **Markdown** | Documentación con formato | ''README.md'', ''AGENTS.md'', PR |
| **JSON** | Datos para intercambiar; configuración JS | APIs REST, ''package.json'' |
| **XML** | Documentos y configuración Java | ''pom.xml'', ''web.xml'' |
| **YAML** | Configuración de despliegue y CI | ''compose.yaml'', GitHub Actions |
| **TOML** | Configuración de herramientas y proyectos | ''pyproject.toml'', ''Cargo.toml'' |
| **.env** | Configuración por máquina y secretos | ''.env'', ''.env.example'' |
Antes de editar un fichero de configuración, identifica su formato: XML, YAML, TOML y ''.env'' se parecen a primera vista, pero la sintaxis es distinta. Para los datos que viajan por una API, JSON; para lo que depende de cada máquina, variables de entorno.