Trabajo con YAML en C++: bibliotecas yaml-cpp y rapidyaml
YAML (YAML Ain't Markup Language) es un formato de serialización de datos que se utiliza ampliamente para archivos de configuración, archivos de descripción de entornos (Docker Compose, Kubernetes), así como para el intercambio de datos entre servicios. A diferencia de JSON, YAML es más legible para los humanos gracias a la indentación y al soporte de comentarios.
C++ no tiene soporte integrado para YAML, pero existen excelentes bibliotecas de terceros. En este artículo, veremos las dos más populares: yaml-cpp (clásica, simple) y rapidyaml (moderna, muy rápida). Aprenderá cómo instalar las bibliotecas, leer un archivo YAML, crearlo mediante programación y manejar errores típicos.
1. Biblioteca yaml-cpp
yaml-cpp es la biblioteca estándar de facto para trabajar con YAML en C++. Proporciona una API conveniente que recuerda al trabajo con contenedores STL. La biblioteca admite la especificación YAML 1.2.
Instalación
La forma más sencilla es usar el gestor de paquetes vcpkg o Conan. Para Linux/macOS:
# Instalación mediante vcpkgvcpkg install yaml-cpp
# Instalación mediante Conanconan install yaml-cpp/0.7.0@Si prefiere compilar manualmente, descargue el código fuente desde GitHub y ejecute:
mkdir build && cd buildcmake ..cmake --build .sudo cmake --install .Análisis de un archivo YAML
Supongamos que tenemos un archivo de configuración config.yaml:
server: host: "localhost" port: 8080 debug: true
database: driver: "postgresql" connection_string: "host=localhost dbname=test" pool_size: 10Ejemplo de lectura y acceso a datos en C++:
#include <yaml-cpp/yaml.h>#include <iostream>#include <string>
int main() { try { // Carga del archivo YAML::Node config = YAML::LoadFile("config.yaml");
// Acceso a nodos anidados std::string host = config["server"]["host"].as<std::string>(); int port = config["server"]["port"].as<int>(); bool debug = config["server"]["debug"].as<bool>();
std::cout << "Server: " << host << ":" << port << " (debug=" << (debug ? "on" : "off") << ")";
// Verificación de existencia de clave if (config["database"]["pool_size"]) { int pool = config["database"]["pool_size"].as<int>(); std::cout << "Pool size: " << pool << ""; }
// Iteración sobre una secuencia (lista) // Supongamos que en YAML hay un campo: hosts: ["alpha", "beta", "gamma"] // for (const auto& h : config["hosts"]) { // std::cout << "Host: " << h.as<std::string>() << ""; // }
} catch (const YAML::Exception& e) { std::cerr << "YAML parsing error: " << e.what() << ""; return 1; } catch (const std::exception& e) { std::cerr << "General error: " << e.what() << ""; return 1; } return 0;}Creación de un documento YAML
Con yaml-cpp no solo se puede leer, sino también generar YAML:
#include <yaml-cpp/yaml.h>#include <fstream>
int main() { YAML::Emitter out; out << YAML::BeginMap; out << YAML::Key << "application"; out << YAML::Value << "MyApp"; out << YAML::Key << "version"; out << YAML::Value << 2.5; out << YAML::Key << "features"; out << YAML::Value << YAML::BeginSeq; out << "logging" << "auth" << "cache"; ou También en la biblioteca
ts-node-dev para TypeScript: guía completa con ejemplos
Express.js para JavaScript (Node.js): guía completa con ejemplos