डिसीरियलाइज़ेशन JSON, XML या Protobuf डेटा स्ट्रीम से ऑब्जेक्ट को पुनर्स्थापित करने की प्रक्रिया है, जो रिमोट API के साथ काम करने वाले किसी भी मोबाइल एप्लिकेशन के लिए आवश्यक है। Apple Developer (2026) के अनुसार, इनकमिंग डेटा का गलत प्रबंधन उपकरणों पर क्रैश के सामान्य कारणों में से एक बना हुआ है। iOS पर JSONDecoder और Android पर Gson मानक उपकरण हैं, लेकिन प्रत्येक की अपनी विशेषताएँ और सीमाएँ हैं।
मुख्य बातें
डिसीरियलाइज़ेशन बाइट स्ट्रीम या संरचित टेक्स्ट को प्रोग्रामिंग भाषा ऑब्जेक्ट में बदलने की प्रक्रिया है। मोबाइल डेवलपमेंट में, यह प्रक्रिया हर बार होती है जब एप्लिकेशन सर्वर से प्रतिक्रिया प्राप्त करता है: एक JSON स्ट्रिंग User, Order या Product क्लास के इंस्टेंस में बदल जाती है। उपयोगकर्ता को डेटा दिखाने वाली स्क्रीन की स्थिरता सीधे डिसीरियलाइज़ेशन की शुद्धता पर निर्भर करती है।
सीरियलाइज़ेशन और डिसीरियलाइज़ेशन परस्पर विपरीत प्रक्रियाएँ हैं, व्यवहार में शायद ही कभी सममित होती हैं। सीरियलाइज़ेशन सर्वर पर भेजने के लिए ऑब्जेक्ट को स्ट्रिंग में बदलता है, जबकि डिसीरियलाइज़ेशन प्राप्त स्ट्रिंग से ऑब्जेक्ट को पुनर्स्थापित करता है। सर्वर एक ऐसा फ़ील्ड भेज सकता है जो क्लाइंट मॉडल में मौजूद नहीं है, एक अलग दिनांक प्रारूप का उपयोग कर सकता है, या संख्या के बजाय null लौटा सकता है। Square Engineering (2025) के अनुसार, प्रारूप विषमता Android एप्लिकेशन में 23% नेटवर्क परत त्रुटियों का कारण बनती है। जोखिम को कम करने के लिए, OpenAPI के माध्यम से स्कीमा वर्जनिंग और सख्त अनुबंध विनिर्देश का उपयोग किया जाता है।
JSON मानव पठनीयता और अंतर्निहित समर्थन के कारण मोबाइल API के लिए सबसे लोकप्रिय प्रारूप बना हुआ है। Google का Protobuf उच्च-लोड सिस्टम में उपयोग किया जाता है — यह JSON की तुलना में 3-6 गुना अधिक कॉम्पैक्ट है और तेज़ी से पार्स होता है, लेकिन .proto फ़ाइलों से कोड जनरेशन की आवश्यकता होती है और उपकरणों के बिना पढ़ने योग्य नहीं है। XML आधुनिक मोबाइल एप्लिकेशन में कम आम है, फिर भी इसका उपयोग एंटरप्राइज़ सिस्टम की SOAP सेवाओं और Android कॉन्फ़िगरेशन फ़ाइलों में किया जाता है। MessagePack एक बाइनरी प्रारूप है जो संरचना में JSON के समान है लेकिन अधिक कॉम्पैक्ट है, जो रीयल-टाइम सिस्टम में लोकप्रिय है।
डिसीरियलाइज़ेशन प्रक्रिया तीन चरणों से गुज़रती है। पहले, टोकनाइज़ेशन कच्चे टेक्स्ट को टोकन में विभाजित करता है: कुंजियाँ, स्ट्रिंग्स, संख्याएँ और सीमांकक। फिर वाक्यात्मक विश्लेषण संरचना की शुद्धता की जाँच करता है — क्या कोष्ठक बंद हैं, क्या उद्धरण चिह्नों का प्रकार सही है, क्या प्रारूप RFC 8259 के अनुरूप है। अंतिम चरण एप्लिकेशन के ऑब्जेक्ट मॉडल पर मैपिंग है, जहाँ प्रत्येक JSON कुंजी को नामकरण रणनीति को ध्यान में रखते हुए एक क्लास गुण निर्दिष्ट किया जाता है।
मोबाइल डेवलपमेंट में मैपिंग के दो दृष्टिकोण उभरे हैं। Reflection (Gson, JSONSerialization) Java Reflection API या Objective-C runtime के माध्यम से रनटाइम पर क्लास संरचना का विश्लेषण करता है — यह लचीला है और अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है, लेकिन धीमा है और अधिक मेमोरी खपत करता है। Code generation (Moshi codegen, kotlinx.serialization, Codable) कंपाइल समय पर कोड उत्पन्न करता है: तेज़, टाइप-सुरक्षित और reflection के माध्यम से आंतरिक संरचना को उजागर नहीं करता है। JetBrains और Square प्रोडक्शन बिल्ड के लिए कोड जनरेशन की सलाह देते हैं — Google बेंचमार्क में प्रदर्शन लाभ 2-4 गुना तक पहुँचता है।
struct User: Codable {
let id: Int
let name: String
let email: String
let createdAt: Date
}
let json = """
{
"id": 42,
"name": "Alice",
"email": "alice@example.com",
"created_at": "2026-06-01T12:00:00Z"
}
"""
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let user = try decoder.decode(User.self, from: data)
Swift में User मॉडल में JSON को डिसीरियलाइज़ करने का उदाहरण। convertFromSnakeCase रणनीति स्वचालित रूप से snake_case API कुंजियों को camelCase मॉडल गुणों में बदल देती है — iOS प्रोजेक्ट में एक मानक अभ्यास। data पैरामीटर URLSession के माध्यम से प्राप्त सर्वर प्रतिक्रिया के कच्चे बाइट्स हैं। try के माध्यम से त्रुटि प्रबंधन एप्लिकेशन को क्रैश किए बिना दोषपूर्ण JSON को पकड़ने की अनुमति देता है।
JSONDecoder चार कुंजी रणनीतियों का समर्थन करता है: useDefaultKeys (सटीक मिलान), convertFromSnakeCase (snake_case → camelCase), custom (closure) और convertFromKebabCase (kebab-case → camelCase)। तिथियों के लिए, .iso8601, .secondsSince1970, .millisecondsSince1970 और कस्टम dateFormatter उपलब्ध हैं। सही रणनीति चुनना मजबूत डिसीरियलाइज़ेशन की ओर पहला कदम है, जो अधिकांश प्रारूप बेमेल त्रुटियों को रोकता है।
JSONDecoder iOS SDK में डिसीरियलाइज़ेशन का मानक तंत्र है, जो Codable प्रोटोकॉल के साथ काम करता है। JSONDecoder स्वचालित रूप से JSON को struct या class इंस्टेंस में पार्स करता है, नेस्टेड ऑब्जेक्ट, ऐरे और प्रिमिटिव का समर्थन करता है। कस्टम लॉजिक के लिए init(from: Decoder) विधि का उपयोग किया जाता है — यह गैर-मानक प्रारूपों, पुराने API संस्करण में लापता फ़ील्ड को संभालने या कई JSON कुंजियों को एक गुण में संयोजित करने की अनुमति देता है।
struct Order: Decodable {
let orderId: String
let amount: Double
let status: OrderStatus
enum OrderStatus: String, Decodable {
case pending, confirmed, shipped, cancelled
}
}
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
let order = try decoder.decode(Order.self, from: jsonData)
DateDecodingStrategy यह निर्धारित करता है कि JSONDecoder दिनांक स्ट्रिंग्स की व्याख्या कैसे करता है। .iso8601 सबसे अधिक उपयोग किया जाता है — मानक REST API प्रारूप। नेस्टेड enum OrderStatus स्वचालित रूप से JSON स्ट्रिंग मानों से डीकोड होता है। यह मैजिक नंबरों से बचाता है और कोड को स्व-दस्तावेजीकरण बनाता है — ऑर्डर स्थिति में हमेशा सख्ती से परिभाषित मानों का सेट होता है।
Swift 4.2 से, Codable व्यक्तिगत गुणों के कस्टम डिसीरियलाइज़ेशन के लिए property wrappers का समर्थन करता है। @DefaultValue एक लोकप्रिय wrapper है जो फ़ील्ड के JSON में अनुपस्थित होने पर डिफ़ॉल्ट मान सेट करता है। @LosslessString स्ट्रिंग को संख्या में और इसके विपरीत परिवर्तित करता है। यह विशेष रूप से उपयोगी है जब सर्वर id को स्ट्रिंग "123" के रूप में भेजता है लेकिन मॉडल Int की अपेक्षा करता है। Property wrappers init(from:) में बॉयलरप्लेट कोड को कम करते हैं और मॉडल को साफ़ बनाते हैं।
Android पर, डिसीरियलाइज़ेशन लाइब्रेरी का चुनाव भाषा और प्रोजेक्ट आवश्यकताओं पर निर्भर करता है। Google का Gson सबसे आम विकल्प है, जो reflection के माध्यम से काम करता है लेकिन जटिल पदानुक्रमों पर प्रदर्शन समस्याएँ हैं। Square का Moshi reflection और code generation दोनों का समर्थन करता है, कम मेमोरी खपत करता है और बड़ी प्रतिक्रियाओं को तेज़ी से संसाधित करता है। JetBrains का kotlinx.serialization कंपाइलर एकीकरण के साथ एक मूल Kotlin समाधान है जो बिल्कुल reflection का उपयोग नहीं करता है।
@Serializable
data class User(
@SerialName("user_id")
val userId: Int,
val name: String,
val email: String,
@SerialName("created_at")
val createdAt: String
)
val json = Json { ignoreUnknownKeys = true }
val user = json.decodeFromString<User>(response)
@Serializable एक Kotlin कंपाइलर एनोटेशन है जो क्लास के लिए कोड जनरेशन को सक्रिय करता है। ignoreUnknownKeys पैरामीटर क्रैश को रोकता है यदि सर्वर मॉडल में लापता फ़ील्ड भेजता है। snake_case कुंजियों के मैपिंग के लिए @SerialName का उपयोग किया जाता है — iOS के convertFromSnakeCase के समकक्ष। JetBrains (2026) के अनुसार, लाइब्रेरी मल्टीप्लेटफ़ॉर्म का समर्थन करती है: वही Serializable क्लास Android, iOS (KMP) और सर्वर-साइड Kotlin पर काम करती है।
लाइब्रेरीज़ के बीच चुनाव गति-लचीलापन समझौते पर आता है। Gson प्रोटोटाइप और Java प्रोजेक्ट के लिए अच्छा है — इसे एनोटेशन की आवश्यकता नहीं है और यह बॉक्स से बाहर काम करता है। Moshi मध्य स्थान रखता है: @JsonClass(generateAdapter = true) के माध्यम से codegen kotlinx.serialization के करीब गति देता है, जबकि reflection मोड Gson का लचीलापन प्रदान करता है। kotlinx.serialization शुद्ध Kotlin प्रोजेक्ट के लिए सबसे तेज़ विकल्प है लेकिन इसके लिए Kotlin 1.4+ और Gradle में Kotlin Serialization प्लगइन की आवश्यकता है।
| लाइब्रेरी | तंत्र | गति | KMP |
|---|---|---|---|
| Gson | Reflection | कम | नहीं |
| Moshi | Reflection / Codegen | मध्यम / उच्च | नहीं |
| kotlinx.serialization | कंपाइलर codegen | उच्च | हाँ |
Type mismatch एक स्थिति है जहाँ JSON में एक प्रकार का मान होता है लेकिन मॉडल दूसरे की अपेक्षा करता है। सर्वर ने संख्या के बजाय स्ट्रिंग "42" भेजी, या बूलियन true के बजाय संख्या 1 भेजी। iOS पर, JSONDecoder डिफ़ॉल्ट रूप से DecodingError.typeMismatch फेंकेगा; Android पर, Gson रूपांतरण का प्रयास करेगा, जबकि Moshi और kotlinx.serialization को स्पष्ट एडेप्टर की आवश्यकता है। समाधान विशिष्ट फ़ील्ड के लिए lenient रणनीतियों या कस्टम डिसीरियलाइज़र का उपयोग करना है।
जब सर्वर एक वैकल्पिक फ़ील्ड शामिल नहीं करता है, तो कोड त्रुटि के साथ क्रैश हो जाता है। Swift में Optional फ़ील्ड और Kotlin में nullable प्रकार समस्या को हल करते हैं: यदि फ़ील्ड null है या JSON में अनुपस्थित है, तो गुण nil/null प्राप्त करता है और एप्लिकेशन काम करना जारी रखता है। आवश्यक फ़ील्ड के लिए, डिसीरियलाइज़ेशन से पहले API क्लाइंट स्तर पर उनकी उपस्थिति की जाँच करना उचित है। Moshi और kotlinx.serialization को डिफ़ॉल्ट रूप से सभी फ़ील्ड की आवश्यकता होती है — nullable मार्किंग और डिफ़ॉल्ट मान इस प्रतिबंध को हटा देते हैं।
सर्वर पर JSON संरचना में बदलाव प्रोडक्शन क्रैश का एक सामान्य स्रोत है। मानक अभ्यास रूट ऑब्जेक्ट में version फ़ील्ड के माध्यम से स्कीमा वर्जनिंग और क्लाइंट पर 2-3 पिछले संस्करणों का समर्थन करना है। kotlinx.serialization विभिन्न संस्करणों के लिए कई मॉडल घोषित करने और JsonElement में प्रारंभिक पार्सिंग के बाद version फ़ील्ड के आधार पर सही मॉडल चुनने की अनुमति देता है। अतिरिक्त सुरक्षा में नए फ़ील्ड के लिए ignoreUnknownKeys और उन फ़ील्ड के लिए डिफ़ॉल्ट मान शामिल हैं जिन्हें हटाया जा सकता है।
| त्रुटि | लक्षण | सुरक्षा वाली लाइब्रेरी |
|---|---|---|
| Type mismatch | DecodingError / अपवाद | kotlinx — coerceInputValues = true |
| लापता फ़ील्ड | एक्सेस पर क्रैश | Moshi — @Transient + default |
| गलत दिनांक प्रारूप | डिकोडिंग त्रुटि | JSONDecoder — dateDecodingStrategy |
| अतिरिक्त फ़ील्ड | अनदेखा या क्रैश | kotlinx — ignoreUnknownKeys = true |
| गैर-null फ़ील्ड में Null | रनटाइम क्रैश | Moshi — lenient @Nullable के साथ |
डिसीरियलाइज़ेशन त्रुटियों की लॉगिंग प्रोडक्शन में एक अनिवार्य अभ्यास है। decode को do/catch में लपेटें, कच्चे JSON और अपेक्षित मॉडल प्रकार को Crashlytics या Sentry में लॉग करें। इससे तुरंत पहचाना जा सकेगा कि किस API का कौन सा फ़ील्ड टूटा और किस एप्लिकेशन संस्करण पर। लॉगिंग के बिना, डिसीरियलाइज़ेशन त्रुटि बिना संदर्भ के एक रहस्यमय क्रैश की तरह दिखती है।
अक्सर पूछे जाने वाले प्रश्न
पार्सिंग टाइप किए गए मॉडल को बनाए बिना संरचित टेक्स्ट को घटक तत्वों में विश्लेषित करना है। डिसीरियलाइज़ेशन पार्सिंग का एक विशिष्ट मामला है जिसका परिणाम ज्ञात गुण प्रकारों वाला एक पूर्ण भाषा ऑब्जेक्ट होता है। पार्सिंग स्ट्रीमिंग हो सकती है, डिसीरियलाइज़ेशन हमेशा एक पूर्ण ऑब्जेक्ट बनाता है।
शुद्ध Kotlin प्रोजेक्ट के लिए, kotlinx.serialization अनुशंसित है — यह कंपाइलर में एकीकृत है, reflection का उपयोग नहीं करती है और Kotlin Multiplatform का समर्थन करती है। मौजूदा Java प्रोजेक्ट के लिए — Moshi code generation के साथ। Gson को लीगेसी प्रोजेक्ट के लिए छोड़ना बेहतर है जहाँ इसे बदलने के लिए महत्वपूर्ण प्रयास की आवश्यकता होगी।
iOS पर, JSONDecoder में keyDecodingStrategy = .convertFromSnakeCase का उपयोग करें। Android पर kotlinx.serialization में, प्रत्येक फ़ील्ड के लिए @SerialName का उपयोग करें। Moshi में, @Json(name="field_name") या ग्लोबल JsonAdapter.Factory लागू करें। प्रोजेक्ट स्तर पर एक सुसंगत शैली API अनुबंध में सहमत एक सर्वोत्तम अभ्यास है।
सबसे आम कारण आवश्यक घोषित फ़ील्ड पर सर्वर से अप्रत्याशित null है। डेवलपमेंट में, सर्वर पूरा डेटा लौटाता है; प्रोडक्शन में, यह एक छोटा प्रतिक्रिया लौटाता है। समाधान: सभी संभावित रूप से लापता फ़ील्ड को Kotlin में nullable या Swift में optional के रूप में चिह्नित करें, ignoreUnknownKeys और डिफ़ॉल्ट मानों का उपयोग करें।
Code generation (Moshi codegen, kotlinx.serialization, Codable) Google बेंचमार्क में reflection से 2-4 गुना तेज़ है। गति के अलावा, कोड जनरेशन टाइप-सुरक्षित है, रनटाइम में क्लास मेटाडेटा की आवश्यकता नहीं है, और टाइप त्रुटियाँ डिसीरियलाइज़ेशन के दौरान नहीं बल्कि कंपाइल समय पर पकड़ी जाती हैं।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें