مقدمة في العمل مع JSON في Kotlin
JSON (JavaScript Object Notation) هو أحد أشهر التنسيقات لتبادل البيانات بين الخادم والعميل. في التطوير الحديث باستخدام Kotlin، سواء كان ذلك لتطبيقات Android أو المشاريع الخادمية، فإن القدرة على العمل بكفاءة مع JSON هي مهارة أساسية. في هذه المقالة، سنشرح بالتفصيل كيفية إجراء تحليل (parsing) وتسلسل (serialization) JSON في Kotlin باستخدام المكتبات الأكثر شيوعًا: kotlinx.serialization و Gson.
بغض النظر عما إذا كنت تنشئ REST API، أو تعالج ردودًا من خدمات خارجية، أو تحفظ الإعدادات المحلية، فإن فهم مبادئ العمل مع JSON سيساعدك على كتابة كود أنظف وأكثر كفاءة.
أساسيات تحليل JSON في Kotlin
ما هو التسلسل (Serialization) وإلغاء التسلسل (Deserialization)؟
قبل الانتقال إلى الكود، من المهم فهم مفهومين رئيسيين:
- التسلسل (Serialization) — تحويل كائن Kotlin (data class، قائمة، إلخ) إلى سلسلة JSON.
- إلغاء التسلسل (Deserialization) أو التحليل (Parsing) — العملية العكسية: إنشاء كائن Kotlin من سلسلة JSON.
لا يحتوي Kotlin على دعم مدمج لـ JSON، لذلك نستخدم مكتبات خارجية. سننظر في أشهر مكتبتين.
مكتبة kotlinx.serialization
kotlinx.serialization هي المكتبة الرسمية من JetBrains، والتي تتكامل بشكل ممتاز مع لغة Kotlin. تعمل في مرحلة الترجمة (compile-time)، مما يضمن أداءً عاليًا وأمانًا في الأنواع.
إضافة المكتبة
للبدء، أضف البرنامج المساعد (plugin) في ملف build.gradle.kts:
plugins { kotlin("plugin.serialization") version "1.9.22"}
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")}تعريف نموذج البيانات
لننشئ كلاسًا لتمثيل مستخدم:
import kotlinx.serialization.Serializable
@Serializabledata class User( val name: String, val age: Int, val email: String? = null, // حقل قابل للقيمة null val roles: List<String> = emptyList())التعليمة @Serializable تخبر المترجم أن هذا الكلاس يمكن تسلسله.
التسلسل (كائن ← JSON)
import kotlinx.serialization.encodeToStringimport kotlinx.serialization.json.Json
fun main() { val user = User( name = "Anna", age = 28, email = "anna@example.com", roles = listOf("admin", "user") )
val jsonString = Json.encodeToString(user) println(jsonString) // {"name":"Anna","age":28,"email":"anna@example.com","roles":["admin","user"]}}إلغاء التسلسل (JSON ← كائن)
import kotlinx.serialization.decodeFromString
fun main() { val json = """{"name":"Ivan","age":35,"roles":["user"]}""" val user = Json.decodeFromString<User>(json) println(user.name) // Ivan println(user.email) // null (غير محدد في JSON)}تكوين إعدادات Json
يمكنك تخصيص سلوك المحلل (parser):
val json = Json { prettyPrint = true // تنسيق جميل ignoreUnknownKeys = true // تجاهل الحقول الإضافية في JSON isLenient = true // السماح بتحليل غير صارم (مثل علامات الاقتباس)}
val user = json.decodeFromString<User>(jsonString)مكتبة Gson
Gson من Google هي مكتبة شائعة أخرى، خاصة في تطوير Android.
إضافة Gson
dependencies { implementation("com.google.code.gson:gson:2.10.1")}مثال على الاستخدام
import com.google.gson.Gson
data class Product( val id: Int, val title: String, val price: Double)
fun main() { val gson = Gson() val product = Product(1, "Laptop", 999.99) // التسلسل val json = gson.toJson(product) println(json) // {"id":1,"title":"Laptop","price":999.99} // إلغاء التسلسل val fromJson = gson.fromJson(json, Product::class.java) println(fromJson.title) // Laptop}