JSONSerialization — Foundation فریم ورک کا ایک بیلٹ ان iOS کلاس ہے جو JSON کو Foundation آبجیکٹس میں تبدیل کرنے اور واپس کرنے کے لیے ڈیزائن کیا گیا ہے۔ یہ API تیسری پارٹی لائبریریوں کے بغیر Apple پلیٹ فارمز پر JSON کے ساتھ کام کرنے کا بنیادی میکانزم ہے، جو ڈکشنری، ارے اوظار اور پریمٹو ٹائپس کے پارسنگ کی حمایت کرتا ہے۔ Apple Developer, 2024 کے مطابق، JSONSerialization لچیلدار JSON ڈیٹا پروسیسنگ کے لیے Data، سٹریمز اور پڑھنے کے اختیارات کے ساتھ کام کرنے کی حمایت کرتا ہے۔
اہم نکات
JSONSerialization Foundation فریم ورک کا ایک کلاس ہے جو iOS، macOS، tvOS اور watchOS پر دستیاب ہے۔ یہ JSON Data کو Foundation آبجیکٹس (NSDictionary، NSArray، NSString، NSNumber) میں تبدیل کرنے اور واپس کرنے کے طریقے فراہم کرتا ہے۔ یہ کلاس iOS 5 میں ظاہر ہوا اور Codable (Swift 4) کے متاعرف تک Apple پلیٹ فارمز پر JSON کے ساتھ کام کا بنیادی طریقہ رہا۔ عمر کے باوجود، JSONSerialization لگیسی Objective-C مناصبوں اور ان صورت حالوں میں متعلق رہتا ہے جہاں مقررہ موڈل اسکیما کے بغیر ڈائنامیک JSON پروسیسنگ کی ضرورت ہی۔
Codable کے آنے کے باوجود، JSONSerialization کئی صورت حالوں میں متعلق رہتا ہے۔ ڈائنامیک JSON ساخت — جب جواب کا فارمیٹ بدلتا ہے یا پہلے سے معلوم نہیں ہوتا — کلیوں کے ذریعے ڈکشنریوں تک رسائی کی ضرورت ہوتی ہے، جو JSONSerialization کے ذریعے کرنا آسان ہے۔ یہ کلاس Objective-C مناصبوں میں بھی استعمال ہوتا ہے جہاں Codable دستیاب نہیں ہے، اور بڑی JSON فائلوں کے تدریجی پارسنگ کے لیے سٹریمز کے ساتھ کام کرتے هوئے۔ ٹیسٹوں اور مک آپ میں، isValidJSONObject اور data(withJSONObject:options:) تیسری پارٹی لائبریریوں کے بغیر تیزی سے JSON فکسچرز تیار کرنے کی اجازت دیتے ہیں، جس سے ڈیویلپمنٹ اور پروٹوٹائپنگ میں تیزی آتی ہے۔
import Foundation
// JSONSerialization کے استعمال کی بنیادی ساخت
let jsonString = """
{
"id": 1,
"name": "John Doe",
"email": "john@example.com"
}
"""
guard let jsonData = jsonString.data(using: .utf8) else {
return
}
do {
let json = try JSONSerialization
.jsonObject(with: jsonData,
options: .mutableContainers)
print(json)
} catch {
print("JSON پارس غلطی: \(error)")
}
JSONSerialization JSON کے ساتھ کام کرنے کے لیے چار اہم طریقے فراہم کرتا ہے۔ اہم طریقہ jsonObject(with:options:) ہے جو Data کو Foundation آبجیکٹس میں تبدیل کرتا ہے۔ data(withJSONObject:options:) طریقہ الٹ سیریلائزیشن کرتا ہے۔ isValidJSONObject(_:) چک کرتا ہے کہ آبجیکٹ سیریلائز کیا جا سکتا ہے یا نہیں۔ writeJSONObject(_:to:options:error:) سیدھا سٹریم میں JSON لکھتا ہے۔ InputStream سے JSON پڑھنے کے لیے، jsonObject(with:options:) طریقہ موجود ہے جو Data کے بجائے سٹریم قبول کرتا ہے، جو سٹریمنگ ڈیٹا واپس کرنے والی نیٹ ورک درخواستوں کے ساتھ انضمام کرتے وقت آسان ہے۔
jsonObject طریقہ Data قبول کرتا ہے اور Any — عموماً NSDictionary یا NSArray — واپس کرتا ہے۔ محفوظ استعمال کے لیے، نتیجہ مشروط کاسٹنگ کے ذریعے متوقعہ ٹائپ میں تبدیل کیا جاتا ہے۔ data طریقہ ایک Foundation آبجیکٹ قبول کرتا ہے اور JSON نمائندگی کے ساتھ Data واپس کرتا ہے۔ .prettyPrinted اختیار پڑھنے کی آسانی کے لیے حاشیہ کے ساتھ فارمیٹنگ شامل کرتا ہے۔
let jsonString = """
{
"products": [
{"id": 1, "name": "iPhone", "price": 999},
{"id": 2, "name": "iPad", "price": 799}
]
}
"""
let data = Data(jsonString.utf8)
if let json = try? JSONSerialization
.jsonObject(with: data) as? [String: Any],
let products = json["products"] as? [[String: Any]] {
for product in products {
if let name = product["name"] as? String {
print("مصنوع: \(name)")
}
}
}
// الٹ سیریلائزیشن: آبجیکٹ -> JSON
let outputDict: [String: Any] = ["status": "ok", "count": 42]
if let outputData = try? JSONSerialization
.data(withJSONObject: outputDict,
options: .prettyPrinted) {
String(data: outputData, encoding: .utf8)
}
بنیادی پارسنگ پریمٹو ٹائپس کے ساتھ ایک ڈکشنری کا JSONSerialization کے ساتھ سب سے عام آپریشن ہے۔ URLSession کے ذریعے Data حاصل کرنے کے بعد، ڈیویلپر jsonObject کو کال کرتا ہے اور نتیجہ کو متوقعہ ٹائپ میں تبدیل کرتا ہے۔ آبجیکٹس کے ارے کے لیے، [[String: Any]] میں کاسٹنگ استعمال کی جاتی ہے، جس کے بعد ہر عنصر ایک لوپ میں پروسیس کیا جاتا ہے۔ یہ طریقہ لچیلدار ہے لیکن دستی ٹائپ منیجمنٹ کی ضرورت ہے۔
حقیقی API ارے، تاریخوں اور اختیاری فیلڈز کے ساتھ پیچیدہ مداخل JSON آبجیکٹس واپس کرتے ہیں۔ JSONSerialization کسی بھی مداخل گھرائی کو صحیح طور پر ہینڈل کرتا ہے، لیکن ڈیویلپر کو ہر سطح کو علاحدہ طور پر ماطلبہ ٹائپ میں تبدیل کرنا ہوگا۔ اس کام کو آسان بنانے کے لیے، Apple ٹائپ شدہ ڈیٹا کے لیے Codable اور صرف ڈائنامیک ساختوں کے لیے JSONSerialization استعمال کرنے کی سفارش کرتا ہے۔
// API جواب کا پارسنگ
func parseUserResponse(data: Data) {
do {
guard let json = try JSONSerialization
.jsonObject(with: data) as? [String: Any]
else { return }
guard let userId = json["id"] as? Int,
let name = json["name"] as? String
else {
throw ParsingError.missingField
}
print("صارف: \(name) (شناخت: \(userId))")
} catch let error as ParsingError {
print("پارسنگ ناکام: \(error)")
} catch {
print("غیر متوقعہ غلطی: \(error)")
}
}
enum ParsingError: Error {
case missingField
case invalidType
}
JSONSerialization غیر موزؤ JSON، ٹائپ کی بے ملنی یا مداخل گھرائی سے تجاوز کرنے پر غلطیاں پھینکتا ہے۔ غلطیاں CocoaError قسم سے تعلق رکھتی ہیں اور مسئلے کی وضاحت کرنے والا کوڈ رکھتی ہیں۔ ڈیویلپر کو do-catch کی تعمیر کے ذریعے انہیں ہینڈل کرنا چاہیے، ورنہ ایپلیکیشن کریش ہو جائے گا۔ سب سے عام غلطیاں ہیں: NSPropertyListReadCorruptError (غیر موزؤ JSON) اور NSPropertyListReadUnknownError۔ ہر قسم کی غلطی کو اپنی الگ ستراٹیجی کی ضرورت ہے: غیر موزؤ فارمیٹ کے لیے ڈیٹا دوبارہ بھیجنے کی درخواست کریں، اور ساخت کی بے ملنی کے لیے پارسنگ موڈل کو اپ ڈیٹ کریں۔
غیر موزؤ JSON — ناکامی کی سب سے عام وجہ: غائب کوما، زائد حرف، یا غیر مستشند نقل کا نشان پورے پارسنگ کو توڑ دیتا ہے۔ دوسری قسم کی غلطی متوقعہ ساخت سے بے ملنی ہے: مثال کے طور پر، سرور نے ڈکشنری کے بجائے ایک ارے واپس کیا۔ JSONSerialization.fragmentsAllowed اس JSON کو پڑھنے کی اجازت دیتا ہے جس کی جڑ ڈکشنری یا ارے نہیں بلکہ ایک پریمٹو قیمت ہو۔ ڈیویلپر کو مداخل گھرائی سے تجاوز کی غلطی کا بھی سامنا کرنا پڑ سکتا ہے جب JSON میں بہت زیادہ درجہ بندی کے مراتب ہوں۔
JSONSerialization پارسنگ ترتیب دےنے کے لیے کئی اختیارات فراہم کرتا ہے۔ .mutableContainers ناقابل تبدیل ورژنز کے بجائے NSMutableDictionary اور NSMutableArray واپس کرتا ہے، جو پارسنگ کے بعد ڈیٹا میں تبدیل کرتے وقت مفید ہے۔ .mutableLeaves سٹرنگ قیمتوں کو قابل تبدیل بناتا ہے۔ .fragmentsAllowed اس JSON کی اجازت دیتا ہے جس کی جڑ کوئی آبجیکٹ یا ارے نہیں بلکہ ایک سٹرنگ یا نمبر ہو — سادہ API جوابوں کے لیے آسان ہے۔ .withoutEscapingSlashes اور .sortedKeys اختیارات data(withJSONObject:options:) طریقے کے لیے دستیاب ہیں، سیریلائزشدہ JSON کی فارمیٹنگ کو کنٹرول کرتے ہیں۔ اختیارات ایک بٹ ماسک کے طور پر منتقل کیے جاتے ہیں، جو لچیلدار پارسنگ ترتیب کے لیے | آپریٹر کے ذریعے متعدد قیمتوں کو ملانے کی اجازت دیتا ہے۔
// مختلف قسموں کی غلطیوں کا انتظام
func safeParse(jsonData: Data) {
do {
let object = try JSONSerialization
.jsonObject(with: jsonData,
options: .fragmentsAllowed)
if let dictionary = object as? [String: Any] {
print("\(dictionary.count) کلیوں کے ساتھ ڈکشنری")
} else if let array = object as? [Any] {
print("\(array.count) آئٹمز کے ساتھ ارے")
}
} catch CocoaError.propertyListReadCorrupt {
print("خراب JSON ڈیٹا")
} catch let error as CocoaError {
print("Cocoa غلطی: \(error)")
} catch {
print("نامعلوم غلطی: \(error)")
}
}
// سیریلائزیشن سے پہلے آبجیکٹ کی موزوئیت کی جانچ
let testObject: [String: Any] = ["key": "value", "nested": ["a": 1]]
if JSONSerialization.isValidJSONObject(testObject) {
print("موزؤ JSON آبجیکٹ")
}
JSONSerialization کی کارکردگی ڈیٹا کے سائز اور کال کی تکرار پر منحصر ہے۔ ایک چہوٹے سرور جواب کے ایک بار پارسنگ کے لیے فرق بھول کرنے کے قابل نہیں ہے، لیکن دسیاں میگابائٹ JSON یا لوپ میں بار بار کال پر کارروائی کرتے وقت، ٹائپ کاسٹنگ کے اورویہڈ پر غور کرنا چاہیے۔ JSONSerialization موجودہ تھریڈ میں ہم آہنگ طور پر کام کرتا ہے، لہذا بڑی دستاویز کے لیے DispatchQueue.global() کے ذریعے پارسنگ کو پس منظر قطار میں لے جانے کی سفارش کی جاتی ہے۔ متبادل طور پر، آپ پوری فائل کو ممری میں لوڈ کیے بغیر سٹریمنگ پروسیسنگ کے لیے InputStream استعمال کر سکتے ہیں، جو محدود وسائل والی ایپلیکیشنوں کے لیے اهم ہے۔ JSON کو فائل یا نیٹ ورک سٹریم میں لکھنے کے لیے، writeJSONObject(_:to:options:error:) طریقہ ایک انترمیڈییٹ Data آبجیکٹ بنائے بغیر سیریلائزشدہ ڈیٹا کو سیدھا OutputStream کو بھیجنے کی اجازت دیتا ہے، جو بڑی دستاویز کے ساتھ کام کرتے وقت میمری کی کھپت کو کم کرتا ہے۔
اکثر پوچے جانے والے سوالات
JSONSerialization ایک Foundation کلاس ہے جو JSON Data کو Foundation آبجیکٹس (NSDictionary, NSArray) میں تبدیل کرنے اور واپس کرنے کے لیے ہے۔ یہ اضافی لائبریریوں کے بغیر iOS، macOS، tvOS اور watchOS پر کام کرتا ہے۔
Codable خودکار ٹائپ شدہ سیریلائزیشن کے لیے ایک Swift پروٹوکل ہے جو ٹائپ محفوظ کوڈ میں کامپائل ہوتا ہے۔ JSONSerialization ڈائنامیک Any ٹائپس کے ساتھ کام کرتا ہے اور دستی کاسٹنگ کی ضرورت ہے۔ Codable نئے مناصبوں کے لیے بہتر ہے، JSONSerialization Objective-C اور ڈائنامیک ڈیٹا کے لیے۔
jsonObject کو کال کرتے وقت do-catch کی تعمیر استعمال کریں۔ JSONSerialization کی غلطیاں CocoaError سے تعلق رکھتی ہیں۔ ڈیبگنگ کے لیے، NSPropertyListReadCorruptError چک کریں، جو غیر موزؤ JSON ڈیٹا فارمیٹ کو ظاہر کرتا ہے۔
جی ہاں، JSONSerialization ڈکشنریوں اور ارے کی کسی بھی مداخل گھرائی کی حمایت کرتا ہے۔ تمام مداخل آبجیکٹس مناسب Foundation قسموں (NSDictionary، NSArray، NSString، NSNumber) میں تبدیل ہو جاتے ہیں، اصلی JSON ساخت کو برقرار رکھتے هوئے۔
JSONSerialization ڈائنامیک JSON ساختوں، Objective-C مناصبوں، سٹریمز کے ساتھ کام کرتے وقت، اور isValidJSONObject کے ذریعے JSON توصیق کے لیے موزؤ ہے۔ معروف اسکیما کے ساتھ ٹائپ شدہ ساختوں کے لیے Codable بہتر ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں