العمل مع YAML في Kotlin: نظرة عامة على المكتبات وأمثلة الاستخدام
\n\nYAML (YAML Ain't Markup Language) هو تنسيق مناسب لتسلسل البيانات، يُستخدم غالبًا لملفات التكوين، ووصف مواصفات API (OpenAPI)، وتبادل البيانات. في نظام Kotlin البيئي، توجد عدة مكتبات ناضجة للعمل مع YAML، لكل منها ميزاتها الخاصة. في هذه المقالة، سنستعرض ثلاثة طرق رئيسية: استخدام SnakeYAML، وkaml، وkotlinx.serialization مع تنسيق YAML.
\n\n1. SnakeYAML — المحلل الكلاسيكي لـ JVM
\n\nSnakeYAML هي مكتبة Java الأكثر شيوعًا للعمل مع YAML، وهي متوافقة تمامًا مع Kotlin. توفر واجهة برمجة تطبيقات منخفضة المستوى لتحليل وإنشاء مستندات YAML.
\n\nالإضافة
\nأضف التبعية في ملف build.gradle.kts:
implementation("org.yaml:snakeyaml:2.2")\n\nمثال: قراءة YAML
\nلنفترض ملف config.yaml:
server:\n host: localhost\n port: 8080\ndatabase:\n url: jdbc:postgresql://localhost/mydb\n user: admin\n password: secret\n\nكود التحليل:
\nimport 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
\nfun 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
- يعمل مع الأنواع الأولية
Map<String, Any>— يتطلب تحويل الأنواع \n - لا يدعم data-كلاسات Kotlin "مباشرة" \n
2. kaml — مكتبة لـ Kotlin مع دعم data-كلاسات
\n\nkaml هي غلاف فوق SnakeYAML، يضيف دعم إلغاء التسلسل إلى data-كلاسات Kotlin والتسلسل منها. تستخدم المكتبة انعكاس Kotlin للتعيين التلقائي.
\n\nالإضافة
\nimplementation("net.mamoe.yamlkt:yamlkt:0.13.0")\n\nمثال: إلغاء التسلسل إلى data-كلاس
\nimport 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مثال: التسلسل
\nfun 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