مقدمة: لماذا JSON في Kotlin هو ألم وفرح في آن واحد
\nإذا كنت قد كتبت أي وقت مضى تطبيقات Android أو خوادم خلفية بلغة Kotlin، فبالتأكيد واجهت JSON. إنه مثل الهواء لمطور العصر الحديث: API، ملفات التكوين، قواعد البيانات - كل شيء يتحدث بهذه اللغة. لكن المفارقة هي: سؤال "How to parse JSON in Kotlin?" على Stack Overflow يحصل على آلاف المشاهدات كل شهر. لماذا؟ لأنه في Kotlin، على عكس Java، يوجد null safety، والمكتبات القديمة مثل Gson تبدأ في "التصرف بغرابة".
\nفي هذا البرنامج التعليمي، سنشرح تحليل JSON في Kotlin من البسيط إلى المعقد. ستتعلم كيفية العمل مع Kotlinx Serialization وMoshi وGson الكلاسيكي. سنكتب كودًا حقيقيًا يمكنك نسخه مباشرة إلى مشروعك. هيا بنا!
\n\n\n\n
ما هو JSON ولماذا لا يتوافق Kotlin معه بسهولة؟
\nJSON (JavaScript Object Notation) هو تنسيق نصي لتبادل البيانات. يبدو تقريبًا هكذا:
\n{\n "name": "Kotlin",\n "year": 2011,\n "features": ["null safety", "coroutines"]\n}\nقد يبدو الأمر بسيطًا، لكن في Kotlin هناك كتابة صارمة وnull safety. عندما تقوم بتحليل JSON، يجب عليك تحديد الحقول التي يمكن أن تكون null بوضوح، وأيها إلزامية. إذا لم تراعِ المكتبة ذلك، فستحصل على NullPointerException أو أخطاء غريبة.
لهذا السبب، اختيار المكتبة الصحيحة لـ تحليل JSON في Kotlin ليس مجرد "مكتبة حسب الذوق"، بل هو مسألة استقرار المشروع.
\n\nأفضل 3 مكتبات لتحليل JSON في Kotlin
\nسننظر في ثلاثة طرق رئيسية. لكل منها إيجابيات وسلبيات.
\n- \n
- Kotlinx Serialization - المكتبة الرسمية من JetBrains. أفضل تكامل مع اللغة. \n
- Moshi - مكتبة حديثة من Square. تعمل مع Java وKotlin. \n
- Gson - المعيار القديم الجيد. لا يزال شائعًا، لكنه يتطلب الحذر مع Kotlin. \n
1. Kotlinx Serialization - اختيار المحترفين
\nهذه مكتبة أصلية لـ Kotlin. تستخدم توليد الكود وتدعم بشكل كامل null safety. إذا كنت تكتب مشروعًا جديدًا بلغة Kotlin، فهذا هو اختيارك.
\nالتثبيت: أضف البرنامج المساعد في build.gradle.kts:
plugins {\n kotlin("plugin.serialization") version "1.9.0"\n}\n\ndependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")\n}\nمثال على الكود:
\nimport kotlinx.serialization.Serializable\nimport kotlinx.serialization.json.Json\n\n@Serializable\ndata class User(\n val name: String,\n val year: Int,\n val features: List<String>\n)\n\nfun main() {\n val jsonString = """\n {\n "name": "Kotlin",\n "year": 2011,\n "features": ["null safety", "coroutines"]\n }\n """.trimIndent()\n\n val user = Json.decodeFromString<User>(jsonString)\n println(user.name) // Kotlin\n println(user.features[0]) // null safety\n}\nلاحظ: Kotlinx Serialization تلتقط الأنواع تلقائيًا. إذا كان الحقل مفقودًا في JSON، ولم يتم وضع علامة عليه كـ nullable في data class، فستحصل على استثناء. هذا جيد - لن تفوتك أي خطأ.
2. Moshi - مرن وسريع
\nMoshi هي مكتبة من Square تم إنشاؤها مع مراعاة Kotlin. كما أنها تدعم توليد الكود وnull safety. على عكس Gson، لا تستخدم Moshi الانعكاس (reflection) افتراضيًا، مما يجعلها أسرع.
\nالتثبيت:
\ndependencies {\n implementation("com.squareup.moshi:moshi-kotlin:1.15.0")\n ksp("com.squareup.moshi:moshi-kotlin-codegen:1.15.0")\n}\nمثال على الكود:
\nim