2009-09-04 15 views
5

के साथ जेसन को Deserialize जेसन के लिए नया थोड़ा हरा।json.net C#

मेरे पास एक विश्राम आधारित सेवा है जो एक जेसन स्ट्रिंग देता है;

{"treeNode":[{"id":"U-2905","pid":"R","userId":"2905"}, 
{"id":"U-2905","pid":"R","userId":"2905"}]} 

मैं Json.net के साथ खेल किया गया है और वस्तुओं में स्ट्रिंग आदि deserialize करने की कोशिश कर रहा में मदद करने के एक extention विधि लिखा था।

public static T DeserializeFromJSON<T>(this Stream jsonStream, Type objectType) 
     { 
      T result; 

      using (StreamReader reader = new StreamReader(jsonStream)) 
      { 
       JsonSerializer serializer = new JsonSerializer(); 
       try 
       { 
        result = (T)serializer.Deserialize(reader, objectType); 
       } 
       catch (Exception e) 
       { 
        throw; 
       } 

      } 
      return result; 
     } 

मैं पेड़ नोड [] ऑब्जेक्ट्स की एक सरणी की अपेक्षा कर रहा था। लेकिन ऐसा लगता है कि अगर पेड़ नोड [] किसी अन्य वस्तु की संपत्ति है तो मैं केवल सही ढंग से deserialize कर सकते हैं।

public class treeNode 
{ 
    public string id { get; set; } 
    public string pid { get; set; } 
    public string userId { get; set; } 
} 

क्या मुझे deserialization से सीधे सरणी प्राप्त करने का कोई तरीका है? serializing जबकि, अपने शुद्ध वस्तु शब्दकोश बल्कि तो पूरा क्लास डाटा

चीयर्स

उत्तर

3

आपको गुमनाम वर्ग इस्तेमाल कर सकते हैं:

T DeserializeJson<T>(string s, T templateObj) { 
    return JsonConvert.Deserialize<T>(s); 
} 

और फिर अपने कोड में:

return DeserializeJson(jsonString, new { treeNode = new MyObject[0] }).treeNode; 
0

दुर्भाग्य से JSON प्रकार सूचना का समर्थन नहीं करता। उचित टाइप मार्शेलिंग का समर्थन करने के लिए आपको JSON serializer और deserializer के व्यवहार को बढ़ाने के लिए कुछ प्रकार का एक्सटेंशन लिखना होगा।

रूट प्रकार देने से ऑब्जेक्ट ग्राफ को सही तरीके से मैप किया जाएगा यदि अपेक्षित प्रकार सटीक हैं और व्युत्पन्न प्रकार नहीं हैं।

उदाहरण के लिए यदि मेरे पास बेस क्लास की सरणी के रूप में संपत्ति है और मेरे वास्तविक मूल्य में किसी भी प्रकार के व्युत्पन्न बाल वर्ग शामिल हो सकते हैं। जेएसओएन पूरी तरह से इसका समर्थन नहीं करता है लेकिन वेब सेवा (एसओएपी) आपको गतिशील टाइपिंग के साथ ऑब्जेक्ट्स को क्रमबद्ध करने की अनुमति देता है।

+2

नहीं है, यदि आप कॉल deserialize करने के लिए सही जड़ प्रकार निर्दिष्ट, Json.NET पता चल जाएगा प्रकार – erikkallen

+0

क्या होगा यदि मेरी संपत्ति का मूल प्रकार है और इसका मूल्य व्युत्पन्न प्रकार है? साबुन इस तरह के मैपिंग का समर्थन करता है। जेएसओएन पूरी तरह से इसका समर्थन नहीं करता है। –