معالجة 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 الحقيقية