2011-12-14 22 views
64

json.net (newtonsoft)
मैं प्रलेखन को देख रहा हूं लेकिन मुझे इस पर कुछ भी नहीं मिल रहा है या ऐसा करने का सबसे अच्छा तरीका नहीं है।Json.net serialize/व्युत्पन्न प्रकार deserialize?

public class Base 
{ 
    public string Name; 
} 
public class Derived : Base 
{ 
    public string Something; 
} 

JsonConvert.Deserialize<List<Base>>(text); 

अब मैंने धारावाहिक सूची में ऑब्जेक्ट व्युत्पन्न की है। मैं सूची को कैसे बेकार कर सकता हूं और व्युत्पन्न प्रकार वापस प्राप्त करूं?

+0

यह नहीं है कि विरासत कैसे काम करती है। आप JsonConvert निर्दिष्ट कर सकते हैं। (टेक्स्ट) को डिसेरियलाइज़ करें; नाम फ़ील्ड शामिल करने के लिए। चूंकि व्युत्पन्न ** एक ** आधार है (आसपास के दूसरे तरीके से नहीं), आधार व्युत्पन्न की परिभाषा के बारे में कुछ भी नहीं जानता है। –

+0

क्षमा करें, थोड़ा सा स्पष्ट करें। मुद्दा यह है कि मेरे पास एक सूची है जिसमें आधार और व्युत्पन्न वस्तुओं दोनों शामिल हैं। इसलिए मुझे यह पता लगाने की ज़रूरत है कि मैं व्युत्पन्न वस्तुओं को कैसे deserialize करने के लिए newtonsoft कैसे बताते हैं। – Will

+0

मैंने इसे हल किया था। मेरे पास एक ही समस्या है –

उत्तर

26

यदि आप अपने text (जैसा कि आपको इस परिदृश्य में होना चाहिए) में टाइप कर रहे हैं, तो आप JsonSerializerSettings का उपयोग कर सकते हैं।

देखें: how to deserialize JSON into IEnumerable<BaseType> with Newtonsoft JSON.NET

+14

आप 'TypeNameHandling = TypeNameHandling.Auto' का भी उपयोग कर सकते हैं - यह केवल उन उदाहरणों के लिए '$ प्रकार' प्रॉपर्टी जोड़ देगा जहां घोषित प्रकार (यानी' बेस') उदाहरण प्रकार से मेल नहीं खाता है (यानी 'व्युत्पन्न ')। इस तरह, यह आपके JSON को 'TypeNameHandling.All' जितना अधिक नहीं फहराता है। –

+0

मैं JSON '..., ...' में निर्दिष्ट त्रुटि हल करने का प्रकार प्राप्त करता रहता हूं। पथ '$ प्रकार', रेखा 1, स्थिति 82. कोई विचार? – Crasher

67

आप प्रकार नाम हैंडलिंग सक्षम है और एक सेटिंग्स पैरामीटर के रूप में (डी) serializer है कि पारित करने के लिए की है।

Base object1 = new Base() { name = "Object1" }; 
Derived object2 = new Derived() { something = "Some other thing" }; 
List<Base> inheritanceList = new List<Base>() { object1, object2 }; 

JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; 
string Serialized = JsonConvert.SerializeObject(inheritanceList, settings); 
List<Base> deserializedList = JsonConvert.DeserializeObject<List<Base>>(Serialized, settings); 

इससे व्युत्पन्न कक्षाओं का सही वांछित परिणाम होगा। इसका एक दोष यह है कि यह उन सभी ऑब्जेक्ट्स का नाम देगा जिन्हें आप उपयोग कर रहे हैं, जैसे कि आप उस ऑब्जेक्ट को नाम देंगे जो आप ऑब्जेक्ट्स डाल रहे हैं।

+22

+1। मैं 30 मिनट तक गुगल रहा था जब तक कि मुझे वास्तव में पता चला कि आपको SerializeObject और DeserializeObject के लिए समान सेटिंग्स का उपयोग करने की आवश्यकता है। मुझे लगता है कि अगर यह deserializing, मूर्ख मुझे वहाँ है तो यह $ प्रकार का उपयोग करेगा। –

+14

'TypeNameHandling.Auto' यह भी करेगा, और यह अच्छा है क्योंकि यह फ़ील्ड/प्रॉपर्टी के प्रकार से मेल खाता है जब यह उदाहरण प्रकार का नाम नहीं लिखता है, जो अक्सर अधिकांश फ़ील्ड/गुणों के मामले में होता है। –

+0

मेरा दिन बचाने के लिए धन्यवाद :) –