معالجة JSON في Swift (iOS/macOS): دليل شامل
JSON (JavaScript Object Notation) هو أحد أكثر تنسيقات تبادل البيانات شيوعًا في التطبيقات الحديثة. في نظام Apple البيئي (iOS، macOS، watchOS، tvOS)، يوفر Swift عدة طرق قوية للعمل مع JSON. في هذه المقالة، سنشرح ثلاثة أساليب رئيسية: الأصلي Codable، ومنخفض المستوى JSONSerialization، والمكتبة الخارجية الشهيرة SwiftyJSON. ستتعلم كيفية تحليل وإنشاء ومعالجة JSON في Swift مع أمثلة برمجية.
1. Codable — المعيار الحديث لـ Swift
بدءًا من Swift 4، قدمت Apple بروتوكولات Codable (التي تجمع بين Encodable و Decodable). هذه هي الطريقة الأكثر ملاءمة وأمانًا من حيث النوع للعمل مع JSON. كل ما عليك فعله هو تعريف هيكل أو فئة تتوافق مع Codable، واستخدام JSONEncoder/JSONDecoder.
مثال: تحليل JSON من استجابة API
import Foundation
// تعريف النموذج، المتوافق تلقائيًا مع Codablestruct User: Codable { let id: Int let name: String let email: String let isActive: Bool}
// مثال لسلسلة JSONlet jsonString = """{ "id": 42, "name": "إيفان بيتروف", "email": "ivan@example.com", "isActive": true}"""
// التحليلif let jsonData = jsonString.data(using: .utf8) { let decoder = JSONDecoder() do { let user = try decoder.decode(User.self, from: jsonData) print("المستخدم: \\(user.name)، البريد الإلكتروني: \\(user.email)") } catch { print("خطأ في فك الترميز: \\(error.localizedDescription)") }}مثال: إنشاء JSON من كائن
let user = User(id: 1, name: "آنا سميرنوفا", email: "anna@test.com", isActive: false)let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // للتنسيق الجميل
if let jsonData = try? encoder.encode(user), let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString)}العمل مع الهياكل المتداخلة والمصفوفات
struct Company: Codable { let name: String let employees: [User]}
let companyJson = """{ "name": "TechCorp", "employees": [ {"id": 1, "name": "أوليغ", "email": "oleg@tc.com", "isActive": true}, {"id": 2, "name": "ماريا", "email": "maria@tc.com", "isActive": false} ]}"""
if let data = companyJson.data(using: .utf8), let company = try? JSONDecoder().decode(Company.self, from: data) { print("الشركة: \\(company.name)، عدد الموظفين: \\(company.employees.count)")}2. JSONSerialization — النهج الكلاسيكي (Foundation)
قبل ظهور Codable، كانت الأداة الرئيسية هي JSONSerialization من Foundation. وهي تعمل مع القواميس والمصفوفات الخاصة بـ Foundation ([String: Any] و [Any]). هذه الطريقة مفيدة عندما يكون هيكل JSON غير معروف مسبقًا أو ديناميكيًا للغاية.
مثال: التحليل باستخدام JSONSerialization
if let data = jsonString.data(using: .utf8) { do { if let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { let id = dict["id"] as? Int ?? 0 let name = dict["name"] as? String ?? "غير معروف" print("المعرف: \\(id)، الاسم: \\(name)") } } catch { print("خطأ: \\(error)") }}العيب: عدم وجود أمان من حيث النوع — يجب تحويل الأنواع يدويًا، مما قد يؤدي إلى أخطاء وقت التشغيل. يُوصى باستخدام Codable حيثما أمكن.
3. SwiftyJSON — مكتبة خارجية ملائمة
SwiftyJSON هي مكتبة مفتوحة المصدر شائعة