معالجة JSON في Swift: Codable وJSONSerialization وأمثلة عملية

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

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

ابدأ الدورة

معالجة JSON في Swift (iOS/macOS): من الأساسيات إلى الاستخدام المتقدم



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



1. الأساسيات: بروتوكول Codable



بروتوكول Codable هو مزيج من Encodable و Decodable. يقوم تلقائيًا بإنشاء الكود لتحويل الهياكل والفئات الخاصة بك إلى JSON والعكس. هذه هي الطريقة الأساسية والموصى بها للعمل مع JSON في Swift الحديث.



1.1. نموذج بيانات بسيط



import Foundation

struct User: Codable { let id: Int let name: String let email: String let isActive: Bool}

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

// فك التشفيرif let jsonData = jsonString.data(using: .utf8) { let decoder = JSONDecoder() if let user = try? decoder.decode(User.self, from: jsonData) { print("المستخدم: \\(user.name)، البريد الإلكتروني: \\(user.email)") }}


1.2. المفاتيح المخصصة (CodingKeys)



إذا كانت المفاتيح في JSON تختلف عن خصائص النموذج (على سبيل المثال، snake_case في JSON وcamelCase في Swift)، استخدم تعداد CodingKeys:



struct Product: Codable {    let productId: Int    let productName: String    let price: Double

enum CodingKeys: String, CodingKey { case productId = "product_id" case productName = "product_name" case price }}

let jsonProduct = """{ "product_id": 101, "product_name": "MacBook Pro", "price": 2499.99}"""


2. العمل مع المصفوفات والكائنات المتداخلة



غالبًا ما تحتوي JSON على مصفوفات من الكائنات أو هياكل متداخلة. يتعامل Codable مع هذا بسهولة:



struct Author: Codable {    let name: String    let books: [Book]}

struct Book: Codable { let title: String let year: Int}

let jsonLibrary = """{ "name": "جوان رولينج", "books": [ {"title": "هاري بوتر وحجر الفيلسوف", "year": 1997}, {"title": "هاري بوتر وحجرة الأسرار", "year": 1998} ]}"""

if let data = jsonLibrary.data(using: .utf8) { let author = try? JSONDecoder().decode(Author.self, from: data) print("المؤلف: \\(author?.name ?? "")، عدد الكتب: \\(author?.books.count ?? 0)")}


3. JSONSerialization — نهج منخفض المستوى



على الرغم من أن Codable هو الطريقة المفضلة، إلا أنه في بعض الأحيان تحتاج إلى العمل مع بيانات ديناميكية أو غير منظمة. في مثل هذه الحالات، استخدم JSONSerialization من Foundation:



let jsonString = """{    "status": "success",    "data": {        "temperature": 22.5,        "humidity": 65,        "city": "موسكو"    }}"""

if let data = jsonString.data(using: .utf8) { do { if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { if let status = json["status"] as? String { print("الحالة: \\(status)") } if let dataDict = json["data"] as? [String: Any], let temp = dataDict["temperature"] as? Double { print("درجة الحرارة: \\(temp)°C") } } } catch { print("خطأ في تحليل JSON: \\(error.localizedDescription)") }}


4. معالجة الأخطاء والقيم الاختيارية



بيانات JSON الحقيقية

توصيات