Travailler avec YAML en Kotlin : bibliothèques, parsing et sérialisation
YAML (YAML Ain't Markup Language) est un format de sérialisation de données populaire, largement utilisé pour les fichiers de configuration, la description des dépendances et l'échange de données. Grâce à sa lisibilité et sa concision, YAML est souvent préféré à JSON ou XML. Dans l'écosystème Kotlin, il existe plusieurs bibliothèques matures pour travailler avec YAML. Dans cet article, nous examinerons trois approches principales : SnakeYAML, Kaml et Jackson YAML.
1. SnakeYAML — le choix classique
SnakeYAML est la bibliothèque Java la plus populaire pour le parsing YAML, qui fonctionne parfaitement également en Kotlin. Elle fournit une API de bas niveau permettant de lire YAML sous forme de Map, List ou d'objets arbitraires.
Ajout de la dépendance (Gradle)
dependencies { implementation("org.yaml:snakeyaml:2.2")}Exemple : lecture d'un 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) // Affichage : {server={host=localhost, port=8080, ssl=false}, database={url=jdbc:postgresql://localhost/mydb, user=admin, password=secret}}}Exemple : mappage vers une 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) // Erreur ! port n'existe pas dans DatabaseConfig}Important : SnakeYAML utilise la réflexion Java, donc les data class doivent avoir un constructeur sans paramètres ou utiliser Constructor avec spécification de la classe. Pour les structures imbriquées, une configuration manuelle peut être nécessaire.
2. Kaml — une bibliothèque Kotlin native
Kaml (Kotlin YAML library) est une bibliothèque moderne écrite en Kotlin utilisant kotlinx.serialization. Elle offre la sécurité des types, la prise en charge des sealed class, des champs nullable et des sérialiseurs personnalisés.
Ajout de la dépendance (Gradle)
dependencies { implementation("net.mamoe.yamlkt:yamlkt:0.13.0") // ou implementation("com.charleskorn.kaml:kaml:0.56.0")}Examinons Kaml de charleskorn, car il est plus populaire et activement développé.
Exemple : sérialisation et désérialisation
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" )
// Sérialisation en YAML val yamlO Aussi dans la bibliothèque
Génération de PDF en JavaScript : bibliothèque pdf-lib
Configuration d'applications en Rust : bibliothèques config et dotenv
Validation des données en TypeScript : Zod, Yup et autres outils
Valibot pour TypeScript : guide complet avec exemples
Travailler avec les dates en Swift : Foundation, SwiftDate, DateTools (iOS/macOS)