Travailler avec YAML en Kotlin : bibliothèques et exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Travailler avec YAML en Kotlin : aperçu des bibliothèques et exemples d'utilisation

\n\n

YAML (YAML Ain't Markup Language) est un format pratique de sérialisation de données, souvent utilisé pour les fichiers de configuration, la description de spécifications API (OpenAPI) et l'échange de données. Dans l'écosystème Kotlin, il existe plusieurs bibliothèques matures pour travailler avec YAML, chacune ayant ses propres caractéristiques. Dans cet article, nous examinerons trois approches principales : l'utilisation de SnakeYAML, kaml et kotlinx.serialization avec le format YAML.

\n\n

1. SnakeYAML — analyseur classique pour JVM

\n\n

SnakeYAML est la bibliothèque Java la plus populaire pour travailler avec YAML, entièrement compatible avec Kotlin. Elle fournit une API de bas niveau pour l'analyse et la création de documents YAML.

\n\n

Ajout de la dépendance

\n

Ajoutez la dépendance dans build.gradle.kts :

\n
implementation("org.yaml:snakeyaml:2.2")
\n\n

Exemple : lecture de YAML

\n

Considérons le fichier config.yaml :

\n
server:\n  host: localhost\n  port: 8080\ndatabase:\n  url: jdbc:postgresql://localhost/mydb\n  user: admin\n  password: secret
\n\n

Code pour l'analyse :

\n
import org.yaml.snakeyaml.Yaml\nimport java.io.File\n\nfun main() {\n    val yaml = Yaml()\n    val inputStream = File("config.yaml").inputStream()\n    val data: Map<String, Any> = yaml.load(inputStream)\n\n    val server = data["server"] as Map<String, Any>\n    println("Hôte : ${server["host"]}")\n    println("Port : ${server["port"]}")\n\n    val db = data["database"] as Map<String, Any>\n    println("URL de la BD : ${db["url"]}")\n}
\n\n

Exemple : création de YAML

\n
fun createYaml() {\n    val data = mapOf(\n        "appName" to "MyApp",\n        "version" to "1.0.0",\n        "features" to listOf("auth", "logging", "metrics")\n    )\n\n    val yaml = Yaml()\n    val writer = FileWriter("output.yaml")\n    yaml.dump(data, writer)\n    writer.close()\n}
\n\n

Avantages de SnakeYAML :

\n
    \n
  • Compatibilité maximale avec les projets Java
  • \n
  • Prise en charge de toutes les fonctionnalités de YAML 1.1 (ancres, balises, types personnalisés)
  • \n
  • Configuration flexible via DumperOptions
  • \n
\n\n

Inconvénients :

\n
    \n
  • Fonctionne avec des types bruts Map<String, Any> — nécessite un transtypage
  • \n
  • Ne prend pas en charge les data-classes Kotlin "prêtes à l'emploi"
  • \n
\n\n

2. kaml — bibliothèque pour Kotlin avec prise en charge des data-classes

\n\n

kaml est un wrapper autour de SnakeYAML qui ajoute la prise en charge de la désérialisation dans les data-classes Kotlin et de la sérialisation à partir de celles-ci. La bibliothèque utilise la réflexion Kotlin pour le mappage automatique.

\n\n

Ajout de la dépendance

\n
implementation("net.mamoe.yamlkt:yamlkt:0.13.0")
\n\n

Exemple : désérialisation en data-classe

\n
import net.mamoe.yamlkt.Yaml\nimport net.mamoe.yamlkt.YamlElement\n\ndata class ServerConfig(\n    val host: String,\n    val port: Int\n)\n\ndata class AppConfig(\n    val server: ServerConfig,\n    val debug: Boolean = false\n)\n\nfun main() {\n    val yaml = Yaml()\n    val input = """\n        server:\n          host: "0.0.0.0"\n          port: 8080\n        debug: true\n    """.trimIndent()\n\n    val config = yaml.decodeFromString(AppConfig.serializer(), input)\n    println("Serveur : ${config.server.host}:${config.server.port}")\n    println("Mode débogage : ${config.debug}")\n}
\n\n

Exemple : sérialisation

\n
fun serializeConfig() {\n    val config = AppConfig(\n        server = ServerConfig("localhost", 9090),\n        debug = false\n    )\n\n    val yaml = Yaml()\n    val output = yaml.encodeToString(AppConfig.serializer(), config)\n    println(output)\n}
\n\n

Avantages de kaml :

\n
    \n
  • Sécurité des types — travail avec les data-classes Kot

Recommendations