2012-04-18 8 views
9

पर पता लगाएं कि मैं JsonConvert.DeserializeObject<T>(string) का उपयोग कर सकता हूं, हालांकि, मुझे ऑब्जेक्ट के _type (जो पहला पैरामीटर नहीं हो सकता है) में देखने के लिए विशिष्ट वर्ग को निर्धारित करने के लिए, । अनिवार्य रूप से, मैं जो करना चाहता हूं वह कुछ है:JSON.Net में जॉब्जेक्ट को टी

//Generic JSON processor for an API Client. 
function MyBaseType ProcessJson(string jsonText) 
{ 
    var obj = JObject.Parse(jsonText); 
    switch (obj.Property("_type").Value.ToString()) { 
    case "sometype": 
     return obj.RootValue<MyConcreteType>(); 
     //NOTE: this doesn't work... 
     // return obj.Root.Value<MyConcreteType>(); 
    ... 
    } 
} 
... 

// my usage... 
var obj = ProcessJson(jsonText); 
var instance = obj as MyConcreteType; 
if (instance == null) throw new MyBaseError(obj); 
+0

मैं कहना चाहिए कि मुख्य रूप से मैं अगर मैं कर सकते हैं दो बार JSON को पार्स से बचने के लिए इच्छुक हूँ। – Tracker1

+0

जेएसओएन का आप किस प्रकार का उपयोग कर रहे हैं जिसमें टाइप जानकारी है? JSON संपत्ति-मूल्य जोड़े का एक संकेत है (जहां मान एक सरणी या अन्य प्रकार का हो सकता है जिसमें संपत्ति-मूल्य के अपने जोड़े शामिल हैं)। लेकिन मैंने कभी भी जेएसओएन प्रकार की जानकारी के साथ नहीं देखा है। जब आप "स्ट्रिंग" करते हैं और JSON पर ऑब्जेक्ट करते हैं तो सभी प्रकार की जानकारी खो जाती है! – JotaBe

+0

@JotaBe यह एक प्रोजेक्ट में उपयोग करने के लिए एक क्लाइंट का निर्माण कर रहा है, जिसका उपयोग मैं कर रहा हूं, उस परियोजना में उपयोग करने के लिए। यह आम तौर पर एक अच्छा विचार है, जब आप किसी ऑब्जेक्ट में लिपटे सभी प्रतिक्रियाओं के लिए JSON के माध्यम से एक एपीआई का पर्दाफाश करते हैं, तो बाहरी प्रतिक्रिया हमेशा एक ऑब्जेक्ट (त्रुटि प्रतिक्रियाओं के लिए भी) होती है, और उस ऑब्जेक्ट के साथ किसी प्रकार की प्रकार की जानकारी होती है .. यह क्लाइंट स्तर पर अपेक्षित प्रतिक्रिया बनाम त्रुटियों को संसाधित करने के मामले में वास्तव में सहायक है ... – Tracker1

उत्तर

24

पहले जेएसओएन को जॉब्जेक्ट में पार्स करें। फिर LINQ से JSON का उपयोग करके _type विशेषता देखें। तब मूल्य के आधार पर स्विच और ToObject<T> का उपयोग कर कास्ट:

var o = JObject.Parse(text); 
var jsonType = (String)o["_type"]; 

switch(jsonType) { 
    case "something": return o.ToObject<Type>(); 
    ... 
} 
+0

कल इसे आज़माएगा। – Tracker1

+0

क्या होगा यदि संकलन समय पर प्रकार ज्ञात नहीं है ??? – Nuzzolilo

+3

@Nuzzolilo उत्तर में प्रश्न में उल्लिखित परिदृश्य को शामिल किया गया है (और टिप्पणियों में स्पष्ट) संतोषजनक रूप से, कुछ कल्पित परिदृश्य नहीं जो आप आए हैं और 5 महीने बाद जोड़े गए हैं। द्वारा छोड़ने के लिए धन्यवाद। – yamen