معالجة JSON في Swift: Codable، JSONSerialization، SwiftJSON

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

معالجة JSON في Swift (iOS/macOS): دليل شامل

JSON (JavaScript Object Notation) هو تنسيق أساسي لتبادل البيانات في تطبيقات iOS/macOS الحديثة. توفر Swift مجموعة قوية من الأدوات للعمل مع JSON، بدءًا من البروتوكولات المدمجة Codable وصولاً إلى المكتبات الخارجية التي تسهل التحليل والتسلسل. في هذه المقالة، سنشرح بالتفصيل جميع الطرق الرئيسية لمعالجة JSON في Swift لمنصات Apple.



الدعم المدمج لـ JSON: Codable (Swift 4+)

بدءًا من Swift 4، قدمت Apple بروتوكولات Codable (التي تجمع بين Encodable و Decodable)، والتي تسمح بتحويل أنواع البيانات المخصصة تلقائيًا إلى JSON والعكس دون كتابة كود boilerplate.



مثال أساسي لفك تشفير JSON

import Foundation

// 1. تعريف نموذج البياناتstruct User: Codable { let id: Int let name: String let email: String let isActive: Bool}

// 2. سلسلة JSONlet jsonString = """{ "id": 1, "name": "إيفان بيتروف", "email": "ivan@example.com", "isActive": true}"""

// 3. فك التشفير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 newUser = User(id: 2, name: "ماريا سيدوروفا", email: "maria@example.com", isActive: false)

let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // لإخراج قابل للقراءة

do { let jsonData = try encoder.encode(newUser) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("خطأ في التشفير: \\(error)")}


العمل مع المفاتيح بصيغة snake_case والاستراتيجيات المخصصة

غالبًا ما تأتي JSON بمفاتيح بصيغة snake_case (مثل first_name)، بينما تُكتب خصائص Swift بصيغة camelCase (firstName). يتم حل ذلك بسطر واحد:

decoder.keyDecodingStrategy = .convertFromSnakeCaseencoder.keyEncodingStrategy = .convertToSnakeCase


JSONSerialization — العمل منخفض المستوى

في الحالات التي يكون فيها هيكل JSON غير معروف مسبقًا أو تتطلب مرونة، يتم استخدام JSONSerialization من Foundation:

if let jsonData = jsonString.data(using: .utf8) {    do {        if let jsonDict = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {            let name = jsonDict["name"] as? String ?? ""            let age = jsonDict["age"] as? Int ?? 0            print("الاسم: \\(name)، العمر: \\(age)")        }    } catch {        print("خطأ: \\(error)")    }}

تعيد هذه الطريقة Any، لذا يلزم تحويل الأنواع. مناسبة للبيانات الديناميكية، ولكنها أقل أمانًا من حيث الأنواع.



المكتبات الخارجية

على الرغم من قوة الأدوات المدمجة، توجد مكتبات شائعة تسهل العمل مع JSON في Swift:



1. SwiftyJSON

واحدة من أشهر المكتبات. تسمح بالوصول إلى عناصر JSON من خلال الاشتراكات (subscripts) ومعالجة القيم الاختيارية تلقائيًا.

// التثبيت عبر Swift Package Manager: https://github.com/SwiftyJSON/SwiftyJSONimport SwiftyJSON

let json = JSON(parseJSON: jsonString)let userName = json["name"].stringValuelet userEmail = json["email"].string ?? "غير محدد"print("الاسم: \\(userName)، البريد الإلكتروني: \\(userEmail)")

// العمل مع الكائنات المتداخلةlet address = json["address"]["city"].stringValue


2. ObjectMapper

مكتبة لرسم خرائط JSON إلى الكائنات والعكس. تتطلب ر

توصيات