العمل مع JSON في Swift: التحليل والتسلسل
JSON (JavaScript Object Notation) أصبح المعيار الفعلي لتبادل البيانات بين العميل والخادم في تطبيقات الهواتف المحمولة وأجهزة الكمبيوتر المكتبية. في نظام Swift البيئي (iOS/macOS)، تم تنفيذ العمل مع JSON على أعلى مستوى — بدءًا من JSONSerialization البسيط وصولاً إلى بروتوكول Codable القوي. في هذه المقالة، سنستعرض جميع الطرق الأساسية لتحليل JSON وتسلسله في Swift، وسنقدم أمثلة عملية ونوضح كيفية تجنب الأخطاء الشائعة.
1. أساسيات العمل مع JSON في Swift: JSONSerialization
قبل ظهور Swift 4، كانت الأداة الرئيسية للعمل مع JSON هي الفئة JSONSerialization المضمنة في Foundation. تتيح لك تحويل بيانات JSON إلى كائنات Swift (قواميس، مصفوفات، نصوص، أرقام) والعكس. تظل هذه الطريقة ذات صلة إذا كنت بحاجة إلى تحكم كامل في العملية أو تعمل مع كود قديم.
تحليل JSON باستخدام JSONSerialization
لنفترض أننا تلقينا سلسلة JSON من الخادم:
let jsonString = """{ "name": "إيفان", "age": 30, "isPremium": true, "hobbies": ["قراءة", "جري", "برمجة"]}"""
guard let jsonData = jsonString.data(using: .utf8) else { fatalError("خطأ في ترميز السلسلة إلى Data")}
do { if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { let name = jsonObject["name"] as? String ?? "" let age = jsonObject["age"] as? Int ?? 0 let isPremium = jsonObject["isPremium"] as? Bool ?? false let hobbies = jsonObject["hobbies"] as? [String] ?? [] print("الاسم: \\(name), العمر: \\(age), مميز: \\(isPremium), الهوايات: \\(hobbies)") }} catch { print("خطأ في تحليل JSON: \\(error.localizedDescription)")}عيب هذه الطريقة هو الحاجة إلى تحويل الأنواع يدويًا ومعالجة القيم الاختيارية. يصبح الكود ضخمًا وعرضة للأخطاء.
التسلسل إلى JSON باستخدام JSONSerialization
العملية العكسية — تحويل قاموس Swift إلى بيانات JSON:
let personDict: [String: Any] = [ "name": "ماريا", "age": 25, "isPremium": false, "hobbies": ["رسم", "يوغا"]]
do { let jsonData = try JSONSerialization.data(withJSONObject: personDict, options: .prettyPrinted) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("خطأ في التسلسل: \\(error.localizedDescription)")}الخيار .prettyPrinted يجعل المخرجات قابلة للقراءة البشرية. للإنتاج، يُستخدم عادةً [] (بدون تنسيق) لتوفير النطاق الترددي.
2. النهج الحديث: بروتوكول Codable و JSONDecoder
بدءًا من Swift 4، أصبح العمل مع JSON أسهل بكثير بفضل بروتوكول Codable (الذي يجمع بين Encodable و Decodable). كل ما عليك فعله هو وصف هيكل البيانات، ويقوم المترجم تلقائيًا بإنشاء الكود للتشفير/فك التشفير.
تحليل JSON باستخدام JSONDecoder
لنحدد نموذجًا لـ JSON الخاص بنا:
struct Person: Codable { let name: String let age: Int let isPremium: Bool let hobbies: [String]}
let jsonString = """{ "name": "إيفان", "age": 30, "isPremium": true, "hobbies": ["قراءة", "جري", "برمجة"]}"""
guard let jsonData = jsonString.data(using: .utf8) else { fatalError("خطأ في ترميز السلسلة")}
do { let person = try JSONDecoder().decode(Person.self, from: jsonData) print("الاسم: \\(person.name), العمر: \\(person.age), مميز: \\(person.isPremium), الهوايات: \\(person.hobbies)")} catch { print("خطأ في فك التشفير: \\(error.localizedDescription)")}كما ترى، أصبح الكود أنظف بكثير. جميع تحويلات الأنواع والتحقق