Trabalhando com YAML em Kotlin: bibliotecas, parsing e serialização
YAML (YAML Ain't Markup Language) é um formato popular de serialização de dados, amplamente utilizado para arquivos de configuração, descrição de dependências e troca de dados. Graças à sua legibilidade e concisão, o YAML é frequentemente preferido ao JSON ou XML. No ecossistema Kotlin, existem várias bibliotecas maduras para trabalhar com YAML. Neste artigo, abordaremos três abordagens principais: SnakeYAML, Kaml e Jackson YAML.
1. SnakeYAML — a escolha clássica
SnakeYAML é a biblioteca Java mais popular para parsing de YAML, que funciona muito bem também em Kotlin. Ela fornece uma API de baixo nível, permitindo ler YAML como Map, List ou objetos arbitrários.
Adicionando dependência (Gradle)
dependencies { implementation("org.yaml:snakeyaml:2.2")}Exemplo: lendo um YAML simples
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) // Saída: {server={host=localhost, port=8080, ssl=false}, database={url=jdbc:postgresql://localhost/mydb, user=admin, password=secret}}}Exemplo: mapeamento para 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) // Erro! port não existe em DatabaseConfig}Importante: SnakeYAML usa reflexão Java, portanto, data classes devem ter um construtor sem parâmetros ou usar Constructor especificando a classe. Para estruturas aninhadas, pode ser necessária configuração manual.
2. Kaml — biblioteca nativa Kotlin
Kaml (Kotlin YAML library) é uma biblioteca moderna escrita em Kotlin usando kotlinx.serialization. Ela oferece segurança de tipos, suporte a sealed class, campos nullable e serializadores personalizados.
Adicionando dependência (Gradle)
dependencies { implementation("net.mamoe.yamlkt:yamlkt:0.13.0") // ou implementation("com.charleskorn.kaml:kaml:0.56.0")}Vamos considerar o Kaml do charleskorn, pois é mais popular e ativamente desenvolvido.
Exemplo: serialização e desserialização
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" )
// Serialização para YAML val yamlO Também na biblioteca
Biblioteca Padrão Java: visão geral completa para iniciantes e profissionais
Pacotes Spatie para PHP: guia completo com exemplos
Trabalho com XML em Go: encoding/xml, bibliotecas e exemplos
CMake para C++: guia completo com exemplos
Validação de dados em Swift (iOS/macOS): melhores práticas e ferramentas