العمل مع YAML في Kotlin: المكتبات والأمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع YAML في Kotlin: نظرة عامة على المكتبات وأمثلة الاستخدام

\n\n

YAML (YAML Ain't Markup Language) هو تنسيق مناسب لتسلسل البيانات، يُستخدم غالبًا لملفات التكوين، ووصف مواصفات API (OpenAPI)، وتبادل البيانات. في نظام Kotlin البيئي، توجد عدة مكتبات ناضجة للعمل مع YAML، لكل منها ميزاتها الخاصة. في هذه المقالة، سنستعرض ثلاثة طرق رئيسية: استخدام SnakeYAML، وkaml، وkotlinx.serialization مع تنسيق YAML.

\n\n

1. SnakeYAML — المحلل الكلاسيكي لـ JVM

\n\n

SnakeYAML هي مكتبة Java الأكثر شيوعًا للعمل مع YAML، وهي متوافقة تمامًا مع Kotlin. توفر واجهة برمجة تطبيقات منخفضة المستوى لتحليل وإنشاء مستندات YAML.

\n\n

الإضافة

\n

أضف التبعية في ملف build.gradle.kts:

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

مثال: قراءة YAML

\n

لنفترض ملف 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

كود التحليل:

\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("المضيف: ${server["host"]}")\n    println("المنفذ: ${server["port"]}")\n\n    val db = data["database"] as Map<String, Any>\n    println("رابط قاعدة البيانات: ${db["url"]}")\n}
\n\n

مثال: إنشاء 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

مزايا SnakeYAML:

\n
    \n
  • أقصى توافق مع مشاريع Java
  • \n
  • دعم جميع إمكانيات YAML 1.1 (المراسي، العلامات، الأنواع المخصصة)
  • \n
  • إعداد مرن عبر DumperOptions
  • \n
\n\n

العيوب:

\n
    \n
  • يعمل مع الأنواع الأولية Map<String, Any> — يتطلب تحويل الأنواع
  • \n
  • لا يدعم data-كلاسات Kotlin "مباشرة"
  • \n
\n\n

2. kaml — مكتبة لـ Kotlin مع دعم data-كلاسات

\n\n

kaml هي غلاف فوق SnakeYAML، يضيف دعم إلغاء التسلسل إلى data-كلاسات Kotlin والتسلسل منها. تستخدم المكتبة انعكاس Kotlin للتعيين التلقائي.

\n\n

الإضافة

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

مثال: إلغاء التسلسل إلى data-كلاس

\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("الخادم: ${config.server.host}:${config.server.port}")\n    println("وضع التصحيح: ${config.debug}")\n}
\n\n

مثال: التسلسل

\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

مزايا kaml:

\n
    \n
  • أمان الأنواع — العمل مع data-كلاسات Kotlin

توصيات