Swift में JSON के साथ कार्य: व्यावहारिक रूप से पार्सिंग और सीरियलाइज़ेशन
\n\nJSON (JavaScript Object Notation) एक हल्का डेटा विनिमय प्रारूप है जो मोबाइल और वेब डेवलपमेंट में क्लाइंट और सर्वर के बीच संचार के लिए डी-फैक्टो मानक बन गया है। Apple इकोसिस्टम (iOS, macOS, watchOS, tvOS) में, JSON के साथ कार्य शक्तिशाली अंतर्निहित तंत्रों के माध्यम से किया जाता है। इस लेख में, हम विस्तार से जानेंगे कि वास्तविक उदाहरणों का उपयोग करके Swift में JSON को कैसे पार्स और सीरियलाइज़ किया जाए, आधुनिक प्रोटोकॉल Codable और क्लासिक JSONSerialization दोनों का उपयोग करते हुए।
यह लेख उन डेवलपर्स के लिए है जो Swift की मूल बातों से पहले से परिचित हैं और JSON प्रारूप में नेटवर्क अनुरोधों और स्थानीय डेटा भंडारण के साथ आत्मविश्वास से काम करना चाहते हैं।
\n\n1. JSON की मूल बातें और Swift ऐप्स में इसका स्थान
\n\nJSON एक टेक्स्ट-आधारित प्रारूप है जो दो संरचनाओं पर आधारित है: ऑब्जेक्ट (कुंजी-मान जोड़े का सेट) और ऐरे (क्रमबद्ध सूचियाँ)। Swift में, ये संरचनाएँ Dictionary और Array के अनुरूप हैं। JSON में डेटा प्रकार सीमित हैं: स्ट्रिंग्स, संख्याएँ, बूलियन मान, null, ऑब्जेक्ट और ऐरे।
iOS/macOS ऐप में JSON के उपयोग का एक विशिष्ट परिदृश्य इस प्रकार है:
\n- \n
- सर्वर से JSON स्ट्रिंग प्राप्त करना (URLSession के माध्यम से)। \n
- JSON को Swift मॉडल (जैसे, स्ट्रक्चर या क्लास) में पार्स करना। \n
- डेटा को संसाधित करना और उसे इंटरफ़ेस में प्रदर्शित करना। \n
- सर्वर पर भेजने के लिए मॉडल का JSON में सीरियलाइज़ेशन (रिवर्स रूपांतरण)। \n
Apple JSON के साथ कार्य करने के लिए दो मुख्य दृष्टिकोण प्रदान करता है: JSONSerialization (निम्न-स्तरीय लेकिन लचीला) और Codable (उच्च-स्तरीय, टाइप-सुरक्षित, Swift 4+ से अनुशंसित)।
2. Codable के साथ JSON पार्सिंग (अनुशंसित तरीका)
\n\nप्रोटोकॉल Codable Encodable (सीरियलाइज़ेशन के लिए) और Decodable (पार्सिंग के लिए) को जोड़ता है। Swift में JSON के साथ कार्य करने का यह सबसे सरल और सुरक्षित तरीका है।
उदाहरण 1: एक सरल JSON ऑब्जेक्ट को पार्स करना
\n\nमान लीजिए, सर्वर निम्नलिखित JSON लौटाता है:
\n{\n "userId": 1,\n "id": 1,\n "title": "उदाहरण कार्य",\n "completed": false\n}\n\nहम Codable के अनुरूप एक मॉडल स्ट्रक्चर बनाएंगे:
struct TodoItem: Codable {\n let userId: Int\n let id: Int\n let title: String\n let completed: Bool\n}\n\nअब JSON स्ट्रिंग को पार्स करें:
\nlet jsonString = """\n{\n "userId": 1,\n "id": 1,\n "title": "उदाहरण कार्य",\n "completed": false\n}\n"""\n\nif let jsonData = jsonString.data(using: .utf8) {\n let decoder = JSONDecoder()\n do {\n let todo = try decoder.decode(TodoItem.self, from: jsonData)\n print("कार्य: \\(todo.title), पूर्ण: \\(todo.completed)")\n } catch {\n print("पार्सिंग त्रुटि: \\(error.localizedDescription)")\n }\n}\n\nउदाहरण 2: ऑब्जेक्ट्स की एक ऐरे को पार्स करना
\n\nयदि सर्वर कार्यों की एक ऐरे लौटाता है:
\n[\n {"userId": 1, "id": 1, "title": "कार्य 1", "completed": false},\n {"userId": 1, "id": 2, "title": "कार्य 2", "completed": true}\n]\n\nपार्सिंग उतनी ही सरल है — बस ऐरे प्रकार निर्दिष्ट करें:
\nlet todoArray = try decoder.decode([TodoItem].self, from: jsonData)\n\n2.1. कस्टम कुंजियाँ और snake_case
\n\nअक्सर JSON snake_case प्रारूप (जैसे, user_id) का उपयोग करता है, जबकि Swift में camelCase (userId) प्रचलित है। JSONDecoder स्वचालित रूप से कुंजियों को रूपांतरित कर सकता है:
decoder.keyDecodingStrategy = .convertFromSnakeCase\n\nयदि गैर-मानक मैपिंग सेट करने की आवश्यकता है, तो CodingKeys एनुम का उपयोग करें:
struct User: Codable {\n let fullName: String\n let emailAddress: String\n\n enum CodingKeys: