2012-12-30 16 views
8

को वस्तुओं की JSON सारणी deserialize करने के लिए मैं एक json स्ट्रिंग ऑब्जेक्ट की श्रृंखला serializing से बनाया गया था कि है:कैसे ग # संरचना

[ 
    { 
     "html": "foo" 
    }, 
    { 
     "html": "bar" 
    } 
] 

मैं कैसे कुछ iterable सी # संरचना करने के लिए यह deserialize कर सकते हैं? मैं इस कोड की कोशिश की है, लेकिन मैं No parameterless constructor defined for type of 'System.String'. त्रुटि हो रही है:

string[] htmlArr = new JavaScriptSerializer().Deserialize<String[]>(html); 

क्या मैं प्राप्त करना चाहते हैं प्रत्येक 'एचटीएमएल' वस्तु प्राप्त करने के लिए एक iterable संरचना है।

+2

चेकआउट, http://stackoverflow.com/questions/3142495/deserialize-json-into -सी-तेज-गतिशील-ऑब्जेक्ट या http://stackoverflow.com/questions/7895105/json-deserialize-c-sharp – MethodMan

+0

लिंक के लिए धन्यवाद, मैं पहले अतिरिक्त कक्षा बनाने के बिना ऐसा करने की कोशिश कर रहा था लेकिन मैं छोड़ सकता हूं इसके साथ मुझे लगता है :) –

+0

[पार्सिंग जेसन ऑब्जेक्ट्स] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/10432647/parsing-json-objects) – nawfal

उत्तर

10

प्रत्येक JSON ऑब्जेक्ट के लिए एक वर्ग का प्रयोग करें। उदाहरण:

public class HtmlItem 
{ 
    [DataMember(Name = "html")] 
    public string Html { get; set; } 
} 

JavaScriptSerializer ser = new JavaScriptSerializer();   

// Serialize 
string html = ser.Serialize(new List<HtmlItem> { 
    new HtmlItem { Html = "foo" }, 
    new HtmlItem { Html = "bar" } 
}); 

// Deserialize and print the html items.   
List<HtmlItem> htmlList = ser.Deserialize<List<HtmlItem>>(html); 
htmlList.ForEach((item) => Console.WriteLine(item.Html)); // foo bar 
+0

मैं आपका उत्तर स्वीकार करता हूं क्योंकि मैंने अंततः लिंक से कुछ ऐसा ही उपयोग किया है प्रश्न टिप्पणी में। इस 'डेटामेम्बर' सजावट के लिए क्या जोड़ा गया है? –

+0

धन्यवाद! मुझे लगता है कि डेटामेम्बर विशेषता में नाम आपके JSON-property को आपके इंस्टेंस प्रॉपर्टी में मैप करने के लिए उपयोग किया जाता है। 'डेटामेम्बर' के बारे में और पढ़ें [यहां] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.aspx) – nekman

+0

बहुत अच्छा - धन्यवाद! – adaam

4

आप उपयोग कर सकते हैं Newtonsoft Json.NET (NuGet से उपलब्ध)

string json = @"[{""html"": ""foo""},{""html"": ""bar""}]"; 
var items = JsonConvert.DeserializeObject<List<Item>>(json); 

कहाँ

public class Item 
{ 
    public string Html { get; set; } 
} 
2

डॉक्स साइट जाहिरा तौर पर अभी कार्य नहीं कर रहा है ... लेकिन मैं JSON.NET का उपयोग कर की कोशिश करेगा (http://james.newtonking.com/projects/json/help/)

तरीकों से आप यह कर सकते हैं के एक जोड़े हैं। आप बहुत ही गतिशील तरीके से सख्त तरीके से deserialize कर सकते हैं या आप किसी ऑब्जेक्ट को परिभाषित कर सकते हैं जो जेसन ऑब्जेक्ट से मेल खाता है और उसमें deserialize। यदि JSON के कई प्रारूप हैं तो आपको क्रमबद्ध करना होगा, मैं स्कीमा का उपयोग करने की अनुशंसा करता हूं।

1

नेकमैन का उत्तर पूरी तरह से सही नहीं है, विशेषता डेटामेम्बर की बजाय जेसनप्रॉपरी होना चाहिए। यह पिछले stackoverflow पोस्ट (इस मामले में आप के बाद से deserializer राजधानी एच के बारे में परवाह नहीं करता विशेषता को हटा सकते हैं)

public class HtmlItem 
{ 
    [JsonProperty("html")] 
    public string Html { get; set; } 
} 

JavaScriptSerializer ser = new JavaScriptSerializer();   

// Serialize 
string html = ser.Serialize(new List<HtmlItem> { 
    new HtmlItem { Html = "foo" }, 
    new HtmlItem { Html = "bar" } 
}); 

// Deserialize and print the html items.   
List<HtmlItem> htmlList = ser.Deserialize<List<HtmlItem>>(html); 
htmlList.ForEach((item) => Console.WriteLine(item.Html)); // foo bar