فك الترميز باستخدام JSONDecoder
حلّل بيانات JSON إلى قيم Swift محددة النوع.
فك الترميز باستخدام JSONDecoder درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
إنشاء JSONDecoder
يعيد JSONDecoder بناء قيمة Swift من Data بصيغة JSON. حدّد له النوع المطلوب إنتاجه، ومرّر إليه البايتات.
import Foundation
struct City: Codable {
var name: String
var population: Int
}
let json = "{\"name\":\"Oslo\",\"population\":700000}"
let data = json.data(using: .utf8)!
let city = try JSONDecoder().decode(City.self, from: data)
print(city.name, city.population)تمرير النوع باستخدام .self
الوسيطة الأولى هي metatype، وتُكتب بالشكل MyType.self. ويخبر ذلك فكّ الترميز بالبنية التي يجب إنشاؤها من البيانات.
import Foundation
struct Flag: Codable { var ok: Bool }
let data = "{\"ok\":true}".data(using: .utf8)!
let result = try JSONDecoder().decode(Flag.self, from: data)
print(result.ok)فك ترميز المصفوفات
لفك ترميز مصفوفة JSON، اطلب نوع مصفوفة مثل [Int].self أو [MyStruct].self.
import Foundation
let json = "[10, 20, 30]"
let data = json.data(using: .utf8)!
let numbers = try JSONDecoder().decode([Int].self, from: data)
print(numbers.reduce(0, +))فك ترميز الكائنات المتداخلة
تقابل كائنات JSON المتداخلة بنى Codable متداخلة. ويتنقل فك الترميز عبر الشجرة ويملأ كل مستوى نيابةً عنك.
import Foundation
struct Coord: Codable { var lat: Double; var lon: Double }
struct Place: Codable { var name: String; var coord: Coord }
let json = "{\"name\":\"X\",\"coord\":{\"lat\":1.0,\"lon\":2.0}}"
let p = try JSONDecoder().decode(Place.self, from: json.data(using: .utf8)!)
print(p.coord.lat, p.coord.lon)التعامل مع أخطاء فك الترميز
يرمي decode استثناءً عندما لا تتطابق البيانات مع النوع. ضع الاستدعاء داخل do/catch للتعامل مع الإدخال غير السليم بسلاسة.
import Foundation
struct User: Codable { var name: String }
let bad = "{\"wrong\":1}".data(using: .utf8)!
do {
let u = try JSONDecoder().decode(User.self, from: bad)
print(u.name)
} catch {
print("Failed:", error)
}أخطاء keyNotFound
من حالات الفشل الشائعة DecodingError.keyNotFound، ويُرمى هذا الخطأ عند فقدان مفتاح مطلوب. استخدم مطابقة الأنماط مع الخطأ لتحديد المشكلة بدقة.
import Foundation
struct User: Codable { var name: String }
let bad = "{}".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(User.self, from: bad)
} catch let DecodingError.keyNotFound(key, _) {
print("Missing key:", key.stringValue)
} catch {
print("Other error:", error)
}أخطاء typeMismatch
إذا كانت قيمة ما من نوع JSON غير صحيح، مثل وجود سلسلة نصية حيث يُتوقع Int، فإن فك الترميز يرمي DecodingError.typeMismatch.
import Foundation
struct Count: Codable { var n: Int }
let bad = "{\"n\":\"oops\"}".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(Count.self, from: bad)
} catch let DecodingError.typeMismatch(type, _) {
print("Type mismatch, expected:", type)
} catch {
print("Other:", error)
}أخطاء dataCorrupted
تؤدي صياغة JSON غير الصالحة إلى رفع DecodingError.dataCorrupted. ويعني ذلك عادةً أن البايتات ليست JSON صالحًا على الإطلاق.
import Foundation
struct User: Codable { var name: String }
let bad = "not json".data(using: .utf8)!
do {
_ = try JSONDecoder().decode(User.self, from: bad)
} catch is DecodingError {
print("Decoding failed: data corrupted")
} catch {
print("Other:", error)
}فك ترميز القيم الاختيارية
إذا كانت الخاصية اختيارية، يُفك ترميز المفتاح المفقود إلى nil من دون رفع خطأ. وهذا يجعل الحقول الاختيارية متسامحة مع غياب البيانات.
import Foundation
struct Profile: Codable {
var name: String
var bio: String?
}
let json = "{\"name\":\"Kai\"}"
let p = try JSONDecoder().decode(Profile.self, from: json.data(using: .utf8)!)
print(p.name, p.bio ?? "no bio")إعادة استخدام Decoder
مثل المشفّر، يمكن إعادة استخدام JSONDecoder مُعدّ مسبقًا مع عدد كبير من الحمولات. احتفظ بنسخة واحدة منه، وفك ترميز مدخلات مختلفة باستخدامها.
import Foundation
struct Word: Codable { var text: String }
let decoder = JSONDecoder()
let inputs = ["{\"text\":\"hi\"}", "{\"text\":\"bye\"}"]
for s in inputs {
let w = try decoder.decode(Word.self, from: s.data(using: .utf8)!)
print(w.text)
}فك الترميز، والفحص، والاستخدام
التدفق الكامل هو: استلام Data، وفك ترميزها إلى قيمة محددة النوع داخل do/catch، ثم استخدام النتيجة محددة النوع بأمان.
import Foundation
struct Weather: Codable {
var city: String
var temp: Double
}
let json = "{\"city\":\"Rome\",\"temp\":21.5}"
do {
let w = try JSONDecoder().decode(Weather.self, from: json.data(using: .utf8)!)
print("\(w.city): \(w.temp)C")
} catch {
print("Decode error:", error)
}اختبار سريع: JSONDecoder
اختبر معرفتك بفك الترميز.
مراجعة: فك الترميز باستخدام JSONDecoder
لقد تعلمت إعادة بناء قيم Swift من JSON:
- ينتج
decode(MyType.self, from: data)قيمة محددة النوع. - تُفك ترميزات المصفوفات والكائنات المتداخلة والقيم الاختيارية تلقائيًا.
- يرمي
decodeحالاتDecodingErrorالتالية:keyNotFoundوtypeMismatchوdataCorruptedوvalueNotFound. - ضع الاستدعاءات داخل
do/catchللتعامل مع الإدخال غير السليم.
الأسئلة الشائعة
هل درس «فك الترميز باستخدام JSONDecoder» مجاني؟
نعم — نص درس «فك الترميز باستخدام JSONDecoder» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «فك الترميز باستخدام JSONDecoder»؟
حلّل بيانات JSON إلى قيم Swift محددة النوع. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «فك الترميز باستخدام JSONDecoder»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المطابقة مع Codable
- الترميز باستخدام JSONEncoder
- فك الترميز باستخدام JSONDecoder
- التعامل مع الأنواع الاختيارية والمتداخلة