مقدمة: لماذا يتعامل Kotlin مع JSON؟
\n\nJSON (JavaScript Object Notation) هو تنسيق خفيف لتبادل البيانات أصبح معيارًا لتطبيقات الويب الحديثة وواجهات برمجة التطبيقات (API). إذا كنت تكتب بلغة Kotlin، سواء كان تطبيق Android أو جزء خادم، فستحتاج عاجلاً أم آجلاً إلى تحليل استجابات JSON من الخادم أو تسلسل كائناتك لإرسالها.
\n\nKotlin هي لغة حديثة تعمل فوق JVM ومتوافقة تمامًا مع Java. ومع ذلك، تمتلك Kotlin أدواتها القوية للعمل مع JSON، مما يجعل الكود أكثر إيجازًا وأمانًا. في هذه المقالة، سنناقش الطريقتين الأكثر شيوعًا: استخدام المكتبة الرسمية kotlinx.serialization والمكتبة المجربة Gson.
\n\nالمقالة موجهة للمبتدئين. سنبدأ بتحليل سلسلة بسيطة، ثم ننتقل إلى إنشاء هياكل متداخلة معقدة، وفي النهاية سنتطرق إلى التسلسل - تحويل كائناتك مرة أخرى إلى JSON.
\n\n1. إعداد المشروع: التبعيات والاستيرادات
\n\nقبل كتابة الكود، تحتاج إلى إضافة المكتبات. سننظر في خيارين.
\n\n1.1. تثبيت kotlinx.serialization
\n\nهذا هو الحل الرسمي من JetBrains. أضف إلى ملف build.gradle.kts:
plugins {\n kotlin("jvm") version "1.9.0"\n kotlin("plugin.serialization") version "1.9.0"\n}\n\ndependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")\n}\n\n\n1.2. تثبيت Gson
\n\nGson هي مكتبة من Google. هي أبسط في الإعداد، ولكنها تتطلب المزيد من العمل اليدوي:
\n\ndependencies {\n implementation("com.google.code.gson:gson:2.10.1")\n}\n\n\nبعد مزامنة المشروع، يمكنك كتابة الكود.
\n\n2. تحليل JSON في Kotlin باستخدام kotlinx.serialization
\n\nهذا الأسلوب هو الأكثر "كوتلينية". تعلن عن فئات البيانات (data classes) وتضيف التعليق التوضيحي @Serializable. ستقوم المكتبة بإنشاء الكود الخاص بالتحليل تلقائيًا.
2.1. مثال بسيط: بيانات المستخدم
\n\nلنفترض أن لدينا سلسلة JSON:
\n\n{\n "name": "آنا",\n "age": 25,\n "email": "anna@example.com"\n}\n\n\nننشئ النموذج:
\n\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\n\n@Serializable\ndata class User(\n val name: String,\n val age: Int,\n val email: String\n)\n\nfun main() {\n val jsonString = """\n {\n "name": "آنا",\n "age": 25,\n "email": "anna@example.com"\n }\n """.trimIndent()\n\n val user = Json.decodeFromString<User>(jsonString)\n println("الاسم: ${user.name}, العمر: ${user.age}")\n}\n\n\nكما ترى، لا توجد تعيينات يدوية - كل شيء تلقائي.
\n\n2.2. العمل مع القوائم والكائنات المتداخلة
\n\nغالبًا ما تُرجع واجهات برمجة التطبيقات (API) الحقيقية مصفوفات. دعنا نضيف حقل address:
@Serializable\ndata class Address(\n val city: String,\n val street: String\n)\n\n@Serializable\ndata class UserWithAddress(\n val name: String,\n val age: Int,\n val address: Address\n)\n\nfun main() {\n val jsonArray = """\n [\n {"name": "إيفان", "age": 30, "address": {"city": "موسكو", "street": "تفيرسكايا"}},\n {"name": "ماريا", "age": 22, "address": {"city": "سانت بطرسبرغ", "street": "نيفسكي"}}\n ]\n """.trimIndent()\n\n val users = Json.decodeFromString<List<UserWithAddress>>(jsonArray)\n users.forEach { println("${it.name} يعيش في ${it.address.city}") }\n}\n\n\nلاحظ: للعمل مع القوائم، نستخدم النوع العام List<UserWithAddress>.
3. تحليل JSON باستخدام Gson
\n\nGson هي مكتبة Java كلاسيكية. تعمل بشكل ممتاز في Kotlin أيضًا، ولكنها تتطلب القليل من الكود الإضافي.
\n\n3.1. التحليل الأساسي
\n\nimport com.google.gson.Gson\n\ndata cl