2012-12-30 6 views
8

nesnelerin JSON dizisi serisini:nasıl nesneleri dizisini seri den oluşturulan bir json dizesi C# yapısına

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

Nasıl bazı iterable C# yapısına bu serisini edebilir? Bu kodu denedim ama No parameterless constructor defined for type of 'System.String'. hatayı alıyorum:

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

Ne almak istediğiniz her 'html' nesne almak için bir iterable yapıdır.

+2

Ödeme bu önceki stackoverflow yazı (deserializer sermaye H umursamayan beri bu durumda özelliğini kaldırabilirsiniz), http://stackoverflow.com/questions/3142495/deserialize-json-into -c-keskin-dinamik-nesne veya http://stackoverflow.com/questions/7895105/json-deserialize-c-sharp – MethodMan

+0

Bağlantılar için teşekkürler, önce ek bir sınıf oluşturmadan bunu yapmaya çalıştım ama ayrılabiliyorum onunla sanırım :) –

+0

olası yinelenen [Parsing json nesneleri] (http://stackoverflow.com/questions/10432647/parsing-json-objects) – nawfal

cevap

10

her JSON nesnesi için bir sınıfını kullanın

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

. Örnek: docs sitesi görünüşte şu anda çalışmıyor ... Ama Json.NET kullanarak denemek istiyorum

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

Nihayet ben bağlantıdan benzer bir şey kullandım gibi cevabını kabul ediyorum soru yorumlarında. Bu DataMember 'dekoratör ne için ekledi? –

+0

Teşekkürler! DataMember özniteliğindeki adın JSON-özelliğinizi örnek özelliğinize eşlemek için kullanıldığını düşünüyorum. DataMember hakkında daha fazla bilgi edinin [burada] (http://msdn.microsoft.com/en-us/library/system.runtime.serialization.datamemberattribute.aspx) – nekman

+0

Çok iyi - teşekkürler! – adaam

4

kullanabilirsiniz (Nuget edinilebilir) Newtonsoft Json.NET

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

(http://james.newtonking.com/projects/json/help/)

bunu yapabilirsiniz birkaç yol vardır. Çok dinamik olmayan tipte katı bir şekilde serileştirebilirsiniz ya da json nesnesine tam olarak uyan bir nesneyi tanımlayabilir ve bunun içine serpiştirebilirsiniz. JSON'un birçok formatı varsa, seri hale getirmeniz gerekecek şemaları kullanmanızı tavsiye ederim.

1

nekman'ın yanıtı tamamen doğru değil, öznitelik DataMember yerine JsonPropery olmalıdır.

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