दिलचस्प पोस्ट
सी से स्टडिंग और स्टड आउट मुख्य थ्रेड पर एक लंबे समय से चलने वाले पार्स ऑपरेशन को निष्पादित किया जा रहा है कोणीय में असुरक्षित लिंक क्या यह `इसे हटाना 'सुरक्षित है? मैं बाहर क्लिक पर एक ड्रॉपडाउन कैसे बंद कर सकता हूं? कई पाइपलाइन मापदंडों के साथ एक टेम्पलेट कॉलिंग टेक्स्टब्लॉक में पाठ को स्वरूपित करना डीआरएफ: नेस्टेड सीरियलइज़र के साथ सरल विदेशी कुंजी असाइनमेंट? FancyBox लौट रहा है "अनुरोधित सामग्री को लोड नहीं किया जा सकता कृपया बाद में फिर से प्रयास करें। "लिंक के साथ टेम्पलेट क्यों आंशिक रूप से विशेष रूप से नहीं किया जा सकता है? सभी वादों के बाद jQuery के डिफरेड के जरिए लूपिंग को बुलाया गया है लिंक पर अनिर्धारित प्रतीक ___gxx_personality_v0 जावा में इटरेटिव कार्टेसीयन उत्पाद getopt पैरामीटर के लिए वैकल्पिक तर्क को पार्स नहीं करता है अजगर फ़ाइलों को संपादित करते समय लाइनों की शुरुआत में टिप्पणियां नहीं डालने के लिए vim को कॉन्फ़िगर कैसे करें

JsonConvert का उपयोग करना। DerserializeObject एक सी # POCO वर्ग के लिए जेसन को डीएसराइलाइज़ करना

यहां मेरी सरल User पीओसीओ कक्षा है:

 /// <summary> /// The User class represents a Coderwall User. /// </summary> public class User { /// <summary> /// A User's username. eg: "sergiotapia, mrkibbles, matumbo" /// </summary> public string Username { get; set; } /// <summary> /// A User's name. eg: "Sergio Tapia, John Cosack, Lucy McMillan" /// </summary> public string Name { get; set; } /// <summary> /// A User's location. eh: "Bolivia, USA, France, Italy" /// </summary> public string Location { get; set; } public int Endorsements { get; set; } //Todo. public string Team { get; set; } //Todo. /// <summary> /// A collection of the User's linked accounts. /// </summary> public List<Account> Accounts { get; set; } /// <summary> /// A collection of the User's awarded badges. /// </summary> public List<Badge> Badges { get; set; } } 

और जिस विधि का उपयोग मैं किसी User ऑब्जेक्ट में एक JSON प्रतिक्रिया deserialize करने के लिए उपयोग कर रहा हूँ (यह वास्तविक JSON कॉल यहाँ है ):

 private User LoadUserFromJson(string response) { var outObject = JsonConvert.DeserializeObject<User>(response); return outObject; } 

यह एक अपवाद सक्रिय करता है:

मौजूदा JSON ऑब्जेक्ट (जैसे {"नाम": "मान"}) प्रकार 'System.Collections.Generic.List`1 [CoderwallDotNet.Api.Models.Account]' प्रकार में deserialize नहीं कर सकता क्योंकि प्रकार के लिए एक JSON सरणी की आवश्यकता है (जैसे [ 1,2,3]) सही ढंग से deserialize करने के लिए

इस त्रुटि को ठीक करने के लिए या तो JSON को किसी JSON सरणी में परिवर्तित करें (जैसे [1,2,3]) या deserialized प्रकार को बदल दें ताकि यह एक सामान्य .नेट प्रकार (उदाहरण के लिए नहीं एक आदिम प्रकार की तरह पूर्णांक, एक संग्रह प्रकार की तरह एक सरणी या सूची) जिसे एक JSON ऑब्जेक्ट से हटाया जा सकता है। JsonObjectAttribute को एक JSON ऑब्जेक्ट से deserialize करने के लिए इसे लागू करने के लिए प्रकार में भी जोड़ा जा सकता है पथ 'accounts.github', पंक्ति 1, स्थिति 12 9

इससे पहले इस DeserializeObject विधि के साथ कभी भी काम नहीं किया, मैं यहाँ पर अटक गया हूं।

मैंने यह सुनिश्चित कर लिया है कि पीओसीओ वर्ग में संपत्ति के नाम JSON प्रतिक्रिया में नाम के समान हैं I

मैं इस पीओसीओ वर्ग में JSON को डीएसरीलाइज़ करने का क्या प्रयास कर सकता हूं?

Solutions Collecting From Web of "JsonConvert का उपयोग करना। DerserializeObject एक सी # POCO वर्ग के लिए जेसन को डीएसराइलाइज़ करना"

यहाँ एक काम उदाहरण है

मुख्य बिंदु हैं:

  • Accounts घोषणा
  • JsonProperty विशेषता का उपयोग

 using (WebClient wc = new WebClient()) { var json = wc.DownloadString("http://coderwall.com/mdeiters.json"); var user = JsonConvert.DeserializeObject<User>(json); } 

 public class User { /// <summary> /// A User's username. eg: "sergiotapia, mrkibbles, matumbo" /// </summary> [JsonProperty("username")] public string Username { get; set; } /// <summary> /// A User's name. eg: "Sergio Tapia, John Cosack, Lucy McMillan" /// </summary> [JsonProperty("name")] public string Name { get; set; } /// <summary> /// A User's location. eh: "Bolivia, USA, France, Italy" /// </summary> [JsonProperty("location")] public string Location { get; set; } [JsonProperty("endorsements")] public int Endorsements { get; set; } //Todo. [JsonProperty("team")] public string Team { get; set; } //Todo. /// <summary> /// A collection of the User's linked accounts. /// </summary> [JsonProperty("accounts")] public Account Accounts { get; set; } /// <summary> /// A collection of the User's awarded badges. /// </summary> [JsonProperty("badges")] public List<Badge> Badges { get; set; } } public class Account { public string github; } public class Badge { [JsonProperty("name")] public string Name; [JsonProperty("description")] public string Description; [JsonProperty("created")] public string Created; [JsonProperty("badge")] public string BadgeUrl; } 

आप एक JsonConverter बना सकते हैं यहां एक उदाहरण के लिए देखें जो आपके प्रश्न के समान है।

एक और, और अधिक सुव्यवस्थित, एक पास्कल-सीज़ित POCO ऑब्जेक्ट के लिए ऊंट-सीज़ेड जेएसओएन स्ट्रिंग को डीएसरिलाइज़ करने के लिए दृष्टिकोण, कैमलसीजप्रोपेर्टीनेट्स कॉन्ट्रैक्ट रीसोलर का उपयोग करना है।

यह न्यूटोंसॉफ्ट का हिस्सा है। जेसन। सेराइलाइज़ेशन नेमस्पेस। यह दृष्टिकोण मानता है कि जेएसएएन ऑब्जेक्ट और पीओसीओ के बीच एकमात्र अंतर संपत्ति के नामों के आवरण में है। अगर संपत्ति के नामों की वर्तनी अलग-अलग हो जाती है, तो आपको संपत्ति के नामों को मैप करने के लिए जेसनोप्रोपर्टी विशेषता का उपयोग करने की ज़रूरत होगी।

 using Newtonsoft.Json; using Newtonsoft.Json.Serialization; . . . private User LoadUserFromJson(string response) { JsonSerializerSettings serSettings = new JsonSerializerSettings(); serSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); User outObject = JsonConvert.DeserializeObject<User>(jsonValue, serSettings); return outObject; } 

खातों की संपत्ति इस तरह परिभाषित है:

 "accounts":{"github":"sergiotapia"} 

आपका पॉको यह बताता है:

 public List<Account> Accounts { get; set; } 

इस जेसन का उपयोग करने की कोशिश करें:

 "accounts":[{"github":"sergiotapia"}] 

वस्तुओं की एक सरणी (जिसे सूची में मैप किया जाना है) हमेशा स्क्वायर ब्रैकेट्स में संलग्न है।

संपादित करें: अकाउंट पोको ऐसा कुछ होगा:

 class Account { public string github { get; set; } } 

और शायद अन्य गुण

2 संपादित करें: एक सरणी संपत्ति का उपयोग निम्नानुसार नहीं करने के लिए:

 public Account Accounts { get; set; } 

कुछ नमूने वर्ग जैसा मैंने पहले संपादन में पोस्ट किया है।

 to fix this error either change the JSON to a JSON array (eg [1,2,3]) or change the deserialized type so that it is a normal .NET type (eg not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object.` 

पूरे संदेश इंगित करता है कि यह सूची ऑब्जेक्ट पर सीरियल करना संभव है, लेकिन इनपुट एक JSON सूची होना चाहिए। इसका अर्थ है कि आपके JSON में शामिल होना चाहिए

 "accounts" : [{<AccountObjectData}, {<AccountObjectData>}...], 

जहां खाताऑब्जेक्ट डेटा JSON आपके खाते ऑब्जेक्ट या आपके बैज ऑब्जेक्ट का प्रतिनिधित्व करता है

ऐसा लगता है कि वर्तमान में यह क्या है

 "accounts":{"github":"sergiotapia"} 

जहां खातों में JSON ऑब्जेक्ट (घुंघराले ब्रेसिज़ द्वारा चिह्नित है), JSON ऑब्जेक्ट्स की कोई सरणी नहीं है (एरेज़ को कोष्ठक द्वारा चिह्नित किया गया है), जो कि आप क्या चाहते हैं। प्रयत्न

 "accounts" : [{"github":"sergiotapia"}] 

यह ठीक नहीं है कि मेरे मन में क्या था। यदि आपके पास सामान्य प्रकार का केवल रनटाइम में जाना जाने वाला है, तो आप क्या करते हैं?

 public MyDTO toObject() { try { var methodInfo = MethodBase.GetCurrentMethod(); if (methodInfo.DeclaringType != null) { var fullName = methodInfo.DeclaringType.FullName + "." + this.dtoName; Type type = Type.GetType(fullName); if (type != null) { var obj = JsonConvert.DeserializeObject(payload); //var obj = JsonConvert.DeserializeObject<type.MemberType.GetType()>(payload); // <--- type ????? ... } } // Example for java.. Convert this to C# return JSONUtil.fromJSON(payload, Class.forName(dtoName, false, getClass().getClassLoader())); } catch (Exception ex) { throw new ReflectInsightException(MethodBase.GetCurrentMethod().Name, ex); } } 

स्वीकृत उत्तर की तर्जों के साथ, अगर आपके पास एक JSON पाठ का नमूना है तो आप इसे इस कनवर्टर में प्लग कर सकते हैं, अपने विकल्पों को चुन सकते हैं और सी # कोड उत्पन्न कर सकते हैं।

यदि आप रनटाइम पर टाइप नहीं जानते हैं, तो यह विषय ऐसा लगता है कि यह फिट होगा

गतिशील रूप से किसी भी ऑब्जेक्ट में json को सीरियल कर दिया। c #