Работа с YAML в C++: библиотека yaml-cpp
YAML (YAML Ain't Markup Language) — это человекочитаемый формат сериализации данных, который часто используется для конфигурационных файлов, обмена данными и хранения структурированной информации. В C++ для работы с YAML существует мощная и простая в использовании библиотека yaml-cpp. В этой статье мы подробно рассмотрим, как установить, настроить и использовать yaml-cpp для парсинга и создания YAML-документов.
Установка yaml-cpp
Библиотека yaml-cpp доступна для большинства платформ. Самый простой способ установки — через пакетный менеджер:
- Ubuntu/Debian:
sudo apt-get install libyaml-cpp-dev - macOS (Homebrew):
brew install yaml-cpp - Windows (vcpkg):
vcpkg install yaml-cpp
Также можно собрать из исходников, скачав репозиторий с GitHub и используя CMake:
git clone https://github.com/jbeder/yaml-cpp.git
cd yaml-cpp
mkdir build && cd build
cmake ..
make
sudo make install
Основы работы с yaml-cpp
Библиотека предоставляет интуитивно понятный API для загрузки, модификации и сохранения YAML-данных. Все типы данных хранятся в контейнере YAML::Node, который может быть скаляром, последовательностью (массивом) или отображением (словарем).
Пример YAML-файла
Рассмотрим следующий конфигурационный файл config.yaml:
database:
host: localhost
port: 5432
name: myapp
credentials:
user: admin
password: secret123
server:
workers: 4
timeout: 30.5
debug: true
allowed_ips:
- 192.168.0.1
- 192.168.0.2
- 10.0.0.1
Парсинг YAML-файла
Для загрузки данных из файла используется функция YAML::LoadFile():
#include <yaml-cpp/yaml.h>
#include <iostream>
#include <string>
#include <vector>
int main() {
try {
// Загружаем YAML-файл
YAML::Node config = YAML::LoadFile("config.yaml");
// Доступ к вложенным данным через оператор []
std::string host = config["database"]["host"].as<std::string>();
int port = config["database"]["port"].as<int>();
std::string user = config["database"]["credentials"]["user"].as<std::string>();
std::cout << "Database host: " << host << std::endl;
std::cout << "Database port: " << port << std::endl;
std::cout << "User: " << user << std::endl;
// Работа с последовательностью (списком)
YAML::Node ips = config["allowed_ips"];
std::vector<std::string> ipList;
for (const auto& ip : ips) {
ipList.push_back(ip.as<std::string>());
}
std::cout << "Allowed IPs: ";
for (const auto& ip : ipList) {
std::cout << ip << " ";
}
std::cout << std::endl;
} catch (const YAML::Exception& e) {
std::cerr << "YAML Error: " << e.what() << std::endl;
return 1;
}
return 0;
}
Создание и сериализация YAML
yaml-cpp также позволяет создавать YAML-документы программно и сохранять их в файл:
#include <yaml-cpp/yaml.h>
#include <fstream>
int main() {
// Создаем корневой узел
YAML::Node config;
// Добавляем данные
config["application"]["name"] = "MyApp";
config["application"]["version"] = 2.1;
config["application"]["debug"] = false;
// Создаем последовательность
config["features"].push_back("logging");
config["features"].push_back("caching");
config["features"].push_back("auth");
// Вложенный словарь
config["limits"]["max_connections"] = 100;
config["limits"]["timeout_ms"] = 5000;
// Сохраняем в файл
std::ofstream fout("output.yaml");
fout << config;
fout.close();
// Или выводим в поток Также в библиотеке
Kotlinx.serialization и Valiktor: валидация данных в Kotlin
Swagger/OpenAPI генерация для JavaScript (Node.js) — инструменты и библиотеки
Ktor Client для Kotlin: полное руководство с примерами