العمل مع YAML في Kotlin: المكتبات، التحليل والتسلسل
YAML (YAML Ain't Markup Language) هو تنسيق شائع لتسلسل البيانات، يُستخدم على نطاق واسع لملفات التكوين، وصف التبعيات وتبادل البيانات. بفضل سهولة قراءته وإيجازه، غالبًا ما يُفضل YAML على JSON أو XML. في نظام Kotlin البيئي، توجد عدة مكتبات ناضجة للعمل مع YAML. في هذه المقالة، سنستعرض ثلاثة مناهج رئيسية: SnakeYAML، Kaml وJackson YAML.
1. SnakeYAML — الاختيار الكلاسيكي
SnakeYAML هي مكتبة Java الأكثر شيوعًا لتحليل YAML، والتي تعمل بشكل ممتاز مع Kotlin أيضًا. توفر واجهة برمجة تطبيقات منخفضة المستوى، تسمح بقراءة YAML كـ Map أو List أو كائنات عشوائية.
الإضافة (Gradle)
dependencies { implementation("org.yaml:snakeyaml:2.2")}مثال: قراءة YAML بسيط
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) // الإخراج: {server={host=localhost, port=8080, ssl=false}, database={url=jdbc:postgresql://localhost/mydb, user=admin, password=secret}}}مثال: التخطيط إلى 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) // خطأ! port غير موجود في DatabaseConfig}هام: يستخدم SnakeYAML انعكاس Java، لذلك يجب أن تحتوي data class على مُنشئ بدون معاملات أو استخدام Constructor مع تحديد الفئة. للهياكل المتداخلة، قد يكون التكوين اليدوي ضروريًا.
2. Kaml — مكتبة Kotlin أصلية
Kaml (مكتبة Kotlin YAML) هي مكتبة حديثة مكتوبة بلغة Kotlin باستخدام kotlinx.serialization. توفر أمان الأنواع، دعم sealed class، الحقول القابلة للصفر (nullable) والمُسلسلات المخصصة.
الإضافة (Gradle)
dependencies { implementation("net.mamoe.yamlkt:yamlkt:0.13.0") // أو implementation("com.charleskorn.kaml:kaml:0.56.0")}سننظر في Kaml من charleskorn، لأنه الأكثر شيوعًا ويتم تطويره بنشاط.
مثال: التسلسل وإلغاء التسلسل
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" )
// التسلسل إلى YAML val yamlO