العمل مع JSON في Swift: التحليل والتسلسل عمليًا

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

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

ابدأ الدورة

العمل مع JSON في Swift: التحليل والتسلسل عمليًا

\n\n

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

\n\n

المقالة موجهة للمطورين الذين لديهم معرفة أساسية بـ Swift ويريدون العمل بثقة مع طلبات الشبكة والتخزين المحلي للبيانات بتنسيق JSON.

\n\n

1. أساسيات JSON ومكانته في تطبيقات Swift

\n\n

JSON هو تنسيق نصي يعتمد على هيكلين: الكائنات (مجموعة أزواج مفتاح-قيمة) والمصفوفات (قوائم مرتبة). في Swift، تقابل هذه الهياكل Dictionary و Array. أنواع البيانات في JSON محدودة: سلاسل نصية، أرقام، قيم منطقية، null، كائنات ومصفوفات.

\n\n

السيناريو النموذجي لاستخدام JSON في تطبيق iOS/macOS يبدو كالتالي:

\n
    \n
  • الحصول على سلسلة JSON من الخادم (عبر URLSession).
  • \n
  • تحليل JSON إلى نماذج Swift (مثل الهياكل أو الفئات).
  • \n
  • معالجة البيانات وعرضها في الواجهة.
  • \n
  • تسلسل (تحويل عكسي) النماذج إلى JSON لإرسالها إلى الخادم.
  • \n
\n\n

توفر Apple طريقتين رئيسيتين للعمل مع JSON: JSONSerialization (منخفض المستوى ولكنه مرن) و Codable (عالي المستوى، آمن من حيث الأنواع، موصى به منذ Swift 4+).

\n\n

2. تحليل JSON باستخدام Codable (الطريقة الموصى بها)

\n\n

البروتوكول Codable يجمع بين Encodable (للتسلسل) و Decodable (للتحليل). هذه هي الطريقة الأسهل والأكثر أمانًا للعمل مع JSON في Swift.

\n\n

مثال 1: تحليل كائن JSON بسيط

\n\n

لنفترض أن الخادم يعيد JSON التالي:

\n
{\n    "userId": 1,\n    "id": 1,\n    "title": "مثال مهمة",\n    "completed": false\n}
\n\n

لننشئ هيكل النموذج المتوافق مع Codable:

\n
struct TodoItem: Codable {\n    let userId: Int\n    let id: Int\n    let title: String\n    let completed: Bool\n}
\n\n

الآن سنقوم بتحليل سلسلة JSON:

\n
let jsonString = """\n{\n    "userId": 1,\n    "id": 1,\n    "title": "مثال مهمة",\n    "completed": false\n}\n"""\n\nif let jsonData = jsonString.data(using: .utf8) {\n    let decoder = JSONDecoder()\n    do {\n        let todo = try decoder.decode(TodoItem.self, from: jsonData)\n        print("المهمة: \\(todo.title)، مكتملة: \\(todo.completed)")\n    } catch {\n        print("خطأ في التحليل: \\(error.localizedDescription)")\n    }\n}
\n\n

مثال 2: تحليل مصفوفة من الكائنات

\n\n

إذا أعاد الخادم مصفوفة من المهام:

\n
[\n    {"userId": 1, "id": 1, "title": "مهمة 1", "completed": false},\n    {"userId": 1, "id": 2, "title": "مهمة 2", "completed": true}\n]
\n\n

التحليل يتم بنفس البساطة — نحتاج فقط إلى تحديد نوع المصفوفة:

\n
let todoArray = try decoder.decode([TodoItem].self, from: jsonData)
\n\n

2.1. المفاتيح المخصصة و snake_case

\n\n

غالبًا ما يستخدم JSON تنسيق snake_case (مثل user_id)، بينما في Swift يُستخدم camelCase (userId). يمكن لـ JSONDecoder تحويل المفاتيح تلقائيًا:

\n
decoder.keyDecodingStrategy = .convertFromSnakeCase
\n\n

إذا كنت بحاجة إلى تعيين تطابق غير قياسي، استخدم التعداد CodingKeys:

\n
struct User: Codable {\n    let fullName: String\n    let emailAddress: String\n\n    enum CodingKeys:                

المدونات

توصيات الكتب