Trabajo con YAML en Kotlin: bibliotecas, análisis y serialización
YAML (YAML Ain't Markup Language) es un formato popular de serialización de datos que se utiliza ampliamente para archivos de configuración, descripción de dependencias e intercambio de datos. Gracias a su legibilidad y concisión, YAML a menudo se prefiere a JSON o XML. En el ecosistema de Kotlin, existen varias bibliotecas maduras para trabajar con YAML. En este artículo, analizaremos tres enfoques principales: SnakeYAML, Kaml y Jackson YAML.
1. SnakeYAML — la elección clásica
SnakeYAML es la biblioteca Java más popular para analizar YAML, que funciona muy bien también en Kotlin. Proporciona una API de bajo nivel que permite leer YAML como Map, List u objetos arbitrarios.
Inclusión (Gradle)
dependencies { implementation("org.yaml:snakeyaml:2.2")}Ejemplo: lectura de YAML simple
import org.yaml.snakeyaml.Yaml
fun main() { val yamlString = """ server: host: "localhost" port: 8080 ssl: false database: url: "jdbc:postgresql://localhost/mydb" user: "admin" password: "secret" """.trimIndent()
val yaml = Yaml() val data: Map<String, Any> = yaml.load(yamlString) println(data) // Salida: {server={host=localhost, port=8080, ssl=false}, database={url=jdbc:postgresql://localhost/mydb, user=admin, password=secret}}}Ejemplo: mapeo a data class
import org.yaml.snakeyaml.Yamlimport org.yaml.snakeyaml.constructor.Constructor
data class ServerConfig( val host: String, val port: Int, val ssl: Boolean)
data class DatabaseConfig( val url: String, val user: String, val password: String)
data class AppConfig( val server: ServerConfig, val database: DatabaseConfig)
fun main() { val yamlString = """ server: host: "localhost" port: 8080 ssl: false database: url: "jdbc:postgresql://localhost/mydb" user: "admin" password: "secret" """.trimIndent()
val yaml = Yaml(Constructor(AppConfig::class.java)) val config: AppConfig = yaml.load(yamlString) println(config.server.host) // localhost println(config.database.port) // ¡Error! port no está en DatabaseConfig}Importante: SnakeYAML utiliza reflexión de Java, por lo que las data class deben tener un constructor sin parámetros o usar Constructor especificando la clase. Para estructuras anidadas, puede ser necesaria una configuración manual.
2. Kaml — biblioteca nativa de Kotlin
Kaml (Kotlin YAML library) es una biblioteca moderna escrita en Kotlin que utiliza kotlinx.serialization. Proporciona seguridad de tipos, soporte para sealed class, campos nullable y serializadores personalizados.
Inclusión (Gradle)
dependencies { implementation("net.mamoe.yamlkt:yamlkt:0.13.0") // o implementation("com.charleskorn.kaml:kaml:0.56.0")}Consideraremos Kaml de charleskorn, ya que es más popular y se desarrolla activamente.
Ejemplo: serialización y deserialización
import kotlinx.serialization.Serializableimport kotlinx.serialization.encodeToStringimport kotlinx.serialization.decodeFromStringimport com.charleskorn.kaml.Yaml
@Serializabledata class ServerConfig( val host: String = "localhost", val port: Int = 8080, val ssl: Boolean = false)
@Serializabledata class AppConfig( val server: ServerConfig, val name: String)
fun main() { val config = AppConfig( server = ServerConfig(host = "example.com", port = 443, ssl = true), name = "MyApp" )
// Serialización a YAML val yamlO