JSON और C# dynamic: यह अब भी दर्द क्यों है (और इसका इलाज क्या है)
\n\nक्या आपने कभी किसी API से JSON रिस्पॉन्स देखकर सोचा है, "भगवान, यह इतना जटिल क्यों है?" खासकर जब डेटा की संरचना हर बार बदलती है जैसे मौसम बदलता है। एक क्लासिक उदाहरण है बाहरी सर्विस का रिस्पॉन्स, जहां फील्ड कभी स्ट्रिंग, कभी ऐरे, और कभी null होते हैं। या जब आपको जल्दी से JSON पार्स करना है, लेकिन उसके लिए अलग क्लास बनाना — माइक्रोस्कोप से सर्किट काटने जैसा लगता है।
ऐसे मामलों के लिए C# में dynamic का जादू है। Stack Overflow पर "Deserialize JSON into C# dynamic object?" सवाल ने हजारों व्यूज जुटाए हैं — और यह कोई संयोग नहीं है। 2025 में, जब माइक्रोसर्विसेज और डायनामिक API आम हो गए हैं, JSON के साथ तेजी से और लचीलेपन से काम करना डेवलपर की सुपरपावर है।
इस लेख में हम C# में JSON को dynamic object में deserialize करने के बेस्ट प्रैक्टिस देखेंगे। बिना उबाऊ थ्योरी के, सिर्फ कोड, उदाहरण और असली लाइफहैक्स। चलिए शुरू करते हैं!
\n\nक्यों dynamic? सिर्फ JObject क्यों नहीं?
\n\nअच्छा सवाल है। C# में JObject (Newtonsoft.Json से) और JsonDocument (System.Text.Json से) भी हैं। वे भी JSON को "ऑन द फ्लाई" पार्स कर सकते हैं। लेकिन dynamic एक महत्वपूर्ण चीज़ देता है — सिंटैक्टिक शुगर।
तुलना करें:
\n\n// JObject के ज़रिए\nvar json = JObject.Parse(rawJson);\nvar name = (string)json["user"]["name"];\n\n// dynamic के ज़रिए\ndynamic obj = JsonConvert.DeserializeObject<dynamic>(rawJson);\nvar name = obj.user.name;\n\n\nदूसरा विकल्प सामान्य कोड जैसा पढ़ा जाता है, न कि "कुंजी निकालो, टाइप कास्ट करो, null चेक करो"। यह विशेष रूप से तब उपयोगी है जब JSON गहराई से नेस्टेड हो।
\n\nतरीका 1: क्लासिक — Newtonsoft.Json (Json.NET)
\n\nहाँ, 2025 का साल है, लेकिन Newtonsoft.Json अब भी जीवित और स्वस्थ है। कई legacy प्रोजेक्ट्स, और कुछ आधुनिक प्रोजेक्ट्स भी, इसे ही इस्तेमाल करते हैं। क्यों? लचीलापन, विस्तारशीलता और लाखों सेटिंग्स।
\n\nबेसिक उदाहरण
\n\nusing Newtonsoft.Json;\n\nstring json = @"\n{\n 'name': 'राहुल',\n 'age': 30,\n 'skills': ['C#', 'Python', 'SQL'],\n 'address': {\n 'city': 'मुंबई',\n 'zip': 400001\n }\n}";\n\ndynamic obj = JsonConvert.DeserializeObject<dynamic>(json);\n\nConsole.WriteLine(obj.name); // राहुल\nConsole.WriteLine(obj.age); // 30\nConsole.WriteLine(obj.skills[0]); // C#\nConsole.WriteLine(obj.address.city); // मुंबई\n\n\nसब कुछ सरल और सुंदर है। लेकिन एक बात है: dynamic के साथ काम करते समय आप IntelliSense और कंपाइल-टाइम टाइप चेकिंग खो देते हैं। फील्ड नाम में गलती रनटाइम पर ही पता चलेगी। इसलिए:
- \n
dynamicका उपयोग केवल उन डेटा को पढ़ने के लिए करें जिन्हें आप नियंत्रित नहीं करते। \n - कॉल को try-catch में ज़रूर लपेटें। \n
- अति प्रयोग न करें — अगर JSON संरचना स्थिर है, तो DTO क्लास बनाना बेहतर है। \n
तरीका 2: आधुनिक — System.Text.Json
\n\n.NET Core 3.0 से शुरू करके, Microsoft System.Text.Json को बढ़ावा दे रहा है — तेज़, नेटिव, बिना बाहरी डिपेंडेंसी के। 2025 में यह नए प्रोजेक्ट्स के लिए मानक है।
लेकिन एक पेंच है: System.Text.Json "आउट ऑफ द बॉक्स" dynamic में deserialize नहीं कर सकता। थोड़ा हथकंडा अपनाना होगा।
विकल्प A: JsonDocument और ExpandoObject के ज़रिए
\n\nusing System.Text.Json;\nusing System.Dynamic;\n\nstring json = @"{""name"":""प्रिया"",""age"":25,""active"":true}";\n\nusing JsonDocument doc = JsonDocument.Parse(json);\ndynamic obj = ConvertToExpando(doc.RootElement);\n\nConsole.WriteLine(obj.name); // प्रिया\nConsole.WriteLine(obj.age); // 25\nConsole.WriteLine(obj.active); // True\n\nstatic ExpandoObject ConvertToExpando(JsonElement element)\n{\n var expando = new ExpandoObject();\n var dict = (IDictionary<string, object>)expando;\n\n foreach (var property in element.Enumera