Swift (iOS/macOS) में ऑब्जेक्ट सीरियलाइज़ेशन: Codable, JSON और PropertyList
सीरियलाइज़ेशन डेटा ऑब्जेक्ट्स को भंडारण या ट्रांसमिशन के लिए उपयुक्त प्रारूप (जैसे JSON, XML, Property List) में बदलने की प्रक्रिया है। Apple इकोसिस्टम (iOS, macOS, watchOS, tvOS) में, Swift सीरियलाइज़ेशन और डीसीरियलाइज़ेशन के लिए एक शक्तिशाली और सुरुचिपूर्ण तंत्र प्रदान करता है - प्रोटोकॉल Codable। इस लेख में, हम विस्तार से जानेंगे कि डेटा के साथ काम करने के लिए Codable, JSONEncoder, PropertyListEncoder और उनके समकक्षों का उपयोग कैसे करें।
Codable क्या है?
Codable एक समग्र प्रोटोकॉल है जो Encodable (किसी ऑब्जेक्ट को बाहरी प्रारूप में एनकोड करने के लिए) और Decodable (बाहरी प्रारूप से ऑब्जेक्ट में डिकोड करने के लिए) को जोड़ता है। यदि आपकी Swift संरचना या क्लास Codable के अनुरूप है, तो आप स्वचालित रूप से इसे सीरियलाइज़ और डीसीरियलाइज़ करने की क्षमता प्राप्त करते हैं।
मूल घोषणा:
struct User: Codable { let id: Int let name: String let email: String}सभी मानक Swift प्रकार (String, Int, Double, Bool, Date, Data, URL और यहां तक कि वैकल्पिक प्रकार और ऐरे/डिक्शनरी) पहले से ही Codable के अनुरूप हैं।
JSON में एनकोडिंग
किसी ऑब्जेक्ट को JSON में एनकोड करने के लिए JSONEncoder का उपयोग किया जाता है। उदाहरण:
let user = User(id: 1, name: "इवान पेत्रोव", email: "ivan@example.com")let encoder = JSONEncoder()encoder.outputFormatting = .prettyPrinted // सुंदर आउटपुट के लिए
do { let jsonData = try encoder.encode(user) if let jsonString = String(data: jsonData, encoding: .utf8) { print(jsonString) }} catch { print("एनकोडिंग त्रुटि: \\(error)")}परिणाम:
{ "id" : 1, "name" : "इवान पेत्रोव", "email" : "ivan@example.com"}JSON से डिकोडिंग
विपरीत रूपांतरण के लिए JSONDecoder का उपयोग किया जाता है:
let jsonString = """{ "id": 2, "name": "मारिया सिदोरोवा", "email": "maria@example.com"}"""let jsonData = Data(jsonString.utf8)let decoder = JSONDecoder()
do { let decodedUser = try decoder.decode(User.self, from: jsonData) print("डिकोड किया गया उपयोगकर्ता: \\(decodedUser.name)")} catch { print("डिकोडिंग त्रुटि: \\(error)")}Property List (plist) के साथ काम करना
XML Property List प्रारूप में सीरियलाइज़ेशन के लिए PropertyListEncoder और PropertyListDecoder का उपयोग किया जाता है। यह कॉन्फ़िगरेशन फ़ाइलों या UserDefaults में डेटा संग्रहीत करने के लिए उपयोगी है।
// plist में एनकोडिंगlet encoder = PropertyListEncoder()encoder.outputFormat = .xml
do { let plistData = try encoder.encode(user) // plistData को फ़ाइल या UserDefaults में सहेजा जा सकता है} catch { print("plist एनकोडिंग त्रुटि: \\(error)")}
// plist से डिकोडिंगlet decoder = PropertyListDecoder()do { let decodedUser = try decoder.decode(User.self, from: plistData) print(decodedUser)} catch { print("plist डिकोडिंग त्रुटि: \\(error)")}कस्टम कुंजियाँ (CodingKeys)
कभी-कभी Swift में गुणों के नाम JSON में कुंजियों से मेल नहीं खाते। इसके लिए 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 }}अब product_id और product_name कुंजियों वाला JSON सही ढंग से संसाधित होगा।
दिनांक और अन्य विशेष प्रकारों को संभालना
डिफ़ॉल्ट रूप से, JSONEncoder और JSONDecoder दिनांकों को TimeInterval के रूप में एनकोड करते हैं