Работа с YAML в Kotlin: обзор библиотек и примеры использования
YAML (YAML Ain't Markup Language) — это удобный формат сериализации данных, часто используемый для конфигурационных файлов, описания API-спецификаций (OpenAPI) и обмена данными. В экосистеме Kotlin существует несколько зрелых библиотек для работы с YAML, каждая из которых имеет свои особенности. В этой статье мы рассмотрим три основных подхода: использование SnakeYAML, kaml и kotlinx.serialization с YAML-форматом.
1. SnakeYAML — классический парсер для JVM
SnakeYAML — это самая популярная Java-библиотека для работы с YAML, которая полностью совместима с Kotlin. Она предоставляет низкоуровневый API для парсинга и создания YAML-документов.
Подключение
Добавьте зависимость в build.gradle.kts:
implementation("org.yaml:snakeyaml:2.2")
Пример: чтение YAML
Рассмотрим файл config.yaml:
server:
host: localhost
port: 8080
database:
url: jdbc:postgresql://localhost/mydb
user: admin
password: secret
Код для парсинга:
import org.yaml.snakeyaml.Yaml
import java.io.File
fun main() {
val yaml = Yaml()
val inputStream = File("config.yaml").inputStream()
val data: Map<String, Any> = yaml.load(inputStream)
val server = data["server"] as Map<String, Any>
println("Хост: ${server["host"]}")
println("Порт: ${server["port"]}")
val db = data["database"] as Map<String, Any>
println("URL БД: ${db["url"]}")
}
Пример: создание YAML
fun createYaml() {
val data = mapOf(
"appName" to "MyApp",
"version" to "1.0.0",
"features" to listOf("auth", "logging", "metrics")
)
val yaml = Yaml()
val writer = FileWriter("output.yaml")
yaml.dump(data, writer)
writer.close()
}
Плюсы SnakeYAML:
- Максимальная совместимость с Java-проектами
- Поддержка всех возможностей YAML 1.1 (якоря, теги, пользовательские типы)
- Гибкая настройка через
DumperOptions
Минусы:
- Работает с сырыми типами
Map<String, Any>— требуется приведение типов - Не поддерживает data-классы Kotlin "из коробки"
2. kaml — библиотека для Kotlin с поддержкой data-классов
kaml — это обёртка над SnakeYAML, которая добавляет поддержку десериализации в data-классы Kotlin и сериализации из них. Библиотека использует рефлексию Kotlin для автоматического маппинга.
Подключение
implementation("net.mamoe.yamlkt:yamlkt:0.13.0")
Пример: десериализация в data-класс
import net.mamoe.yamlkt.Yaml
import net.mamoe.yamlkt.YamlElement
data class ServerConfig(
val host: String,
val port: Int
)
data class AppConfig(
val server: ServerConfig,
val debug: Boolean = false
)
fun main() {
val yaml = Yaml()
val input = """
server:
host: "0.0.0.0"
port: 8080
debug: true
""".trimIndent()
val config = yaml.decodeFromString(AppConfig.serializer(), input)
println("Сервер: ${config.server.host}:${config.server.port}")
println("Режим отладки: ${config.debug}")
}
Пример: сериализация
fun serializeConfig() {
val config = AppConfig(
server = ServerConfig("localhost", 9090),
debug = false
)
val yaml = Yaml()
val output = yaml.encodeToString(AppConfig.serializer(), config)
println(output)
}
Плюсы kaml:
- Типобезопасность — работа с data-классами Kotlin
- Поддержка значений по умолчанию (
debug: false) - Простой API с использованием
serializer()
Минусы:
- Меньше возможностей, чем у чистого SnakeYAML (например, нет поддержки пользовательских тегов)
-
Также в библиотеке
Работа с Excel в JavaScript (Node.js): библиотеки и примеры кода
HTTP-клиент для Java: топ библиотек для работы с HTTP
Планировщик задач PHP: cron-подобный менеджер очередей на PHP
Socket.io для JavaScript (Node.js): полное руководство с примерами
Elasticsearch клиент для Rust: официальная библиотека elasticsearch-rs
Рекомендаций