2012-07-11 21 views
8

मैं एक json संरचना है कि कुछ इस तरह दिखता है:deserializing JSON उपवर्गों

"list":[ 
    { 
    "type":"link", 
    "href":"http://google.com" 
    }, 
    { 
    "type":"image", 
    "src":"http://google.com/logo.png" 
    }, 
    { 
    "type":"text", 
    "text":"some text here" 
    }, 
] 

मैं वस्तुओं की एक सूची है, जहां प्रत्येक वस्तु एक आधार के एक उपवर्ग है में इस deserialize चाहते हैं कक्षा। सूची में प्रत्येक आइटम में अलग-अलग गुण होते हैं (href, src, text), इसलिए मैं एक ही कक्षा तक पहुंचने के लिए उपयोग नहीं कर सकता। इसके बजाय मुझे एक सामान्य वर्ग के तीन उप-वर्ग चाहिए। जेएसओएन सूची में प्रत्येक आइटम की प्रकार की संपत्ति का उपयोग यह तय करने के लिए किया जा सकता है कि किस सबक्लास का उपयोग करना है। तो उदाहरण के लिए, मेरे पास निम्नलिखित कक्षाएं

public Item{ 
    public string type {get; set;} 
} 
public LinkItem : Item { 
    public string href {get; set;} 
} 
public ImageItem : Item { 
    public string src {get; set;} 
} 
public TextItem : Item { 
    public string text {get; set;} 
} 

क्या ऐसा करने का कोई तरीका है? या विषम वस्तु प्रकारों की एक सूची deserialize करने के लिए एक बेहतर तरीका है?

EDIT:

मैं जिस तरह से

+0

सभी संपत्तियों वाले वर्ग को बनाने के बारे में कैसे। उस वर्ग के उदाहरणों की एक सूची प्राप्त करने के लिए deserialize। फिर विशिष्ट उदाहरण बनाने के लिए आवश्यक गुणों को टाइप करें और प्रोजेक्ट करें। मुझे लगता है कि यह वही है जो आप वर्तमान में कर रहे हैं, और एक बेहतर तरीका ढूंढ रहे हैं? –

+0

चूंकि एप्लिकेशन बढ़ता है, अलग-अलग वस्तुओं की जटिलता बढ़ सकती है, और ऐसा लगता है कि इसमें प्रत्येक संभावित संपत्ति के साथ बेस क्लास होना बुरा विचार है। मैं जो सोच रहा हूं वह एक अज्ञात ऑब्जेक्ट का उपयोग कर रहा है, और उसके बाद बाद में एक उदाहरण बना रहा है। – Marius

+0

मेरा मतलब बेस क्लास नहीं था। मैं इंटरमीडिएट डीटीओ कक्षा के बारे में सोच रहा था जिसमें सभी संभावित विकल्प हैं। डीटीओ ऑब्जेक्ट्स की एक सूची से, आप अपनी आवश्यक विशेष वस्तुओं को आकार दे सकते हैं। इस तरह, आपके डोमेन को क्रमबद्धता चिंताओं के साथ उलझन में नहीं होना पड़ेगा। उस ने कहा, आप गतिशील वस्तु का उपयोग कर सकते हैं? मुझे एहसास नहीं हुआ कि अज्ञात प्रकार आपको कुछ गुणों को परिभाषित नहीं कर सकते हैं ... जैसा कि पहले deserialized anon ऑब्जेक्ट के गुणों में वही गुण नहीं हैं जो दूसरे deserialized anon ऑब्जेक्ट होगा। –

उत्तर

1

रूप @AmithGeorge सुझाव दिया द्वारा json.net उपयोग कर रहा हूँ, आप एक dynamic वस्तु का उपयोग गतिशील रूप से आपकी json वस्तु पार्स करने के लिए कर सकते हैं। आप this great dynamic class for JSON by Shawn Weisfeld का उपयोग कर सकते हैं। Here is his blog explaining how he do it

JavaScriptSerializer jss = new JavaScriptSerializer(); 
jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() }); 

dynamic glossaryEntry = jss.Deserialize(json, typeof(object)) as dynamic; 

Console.WriteLine("glossaryEntry.glossary.title: " + glossaryEntry.glossary.title); 
Console.WriteLine("glossaryEntry.glossary.GlossDiv.title: " + glossaryEntry.glossary.GlossDiv.title); 
Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.ID: " + glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.ID); 
Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para: " + glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.para); 
foreach (var also in glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso) 
{ 
    Console.WriteLine("glossaryEntry.glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso: " + also); 
} 
+0

का संभावित डुप्लिकेट लिंक मर चुका है । क्या आप पा सकते हैं और दोबारा पोस्ट कर सकते हैं? - धन्यवाद! –

+0

@DanVioletSagmiller मुझे खेद है, मुझे लगता है कि उसने पहले से ही अपनी भंडार हटा दी है। आप अभी भी मेरे दूसरे [लिंक] पर निर्देशों का पालन कर सकते हैं (http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2010/08/22/using-c-4.0-and-dynamic-to-parse-json.aspx) हालांकि। –

संबंधित मुद्दे