2012-12-30 47 views
8

的JSON數組我有一個從序列化對象的數組創建一個JSON字符串:如何反序列化對象的C#結構

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

如何我可以將它反序列化一些迭代C#結構?我試過這個代碼,但我得到No parameterless constructor defined for type of 'System.String'.錯誤:

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

我想接收是一個迭代結構得到每個「HTML」對象。

+2

結帳這個以前計算器後,http://stackoverflow.com/questions/3142495/deserialize-json-into -c-sharp-dynamic-object或http://stackoverflow.com/questions/7895105/json-deserialize-c-sharp – MethodMan

+0

感謝您的鏈接,我第一次嘗試這樣做,而不創建額外的類,但我可以離開與它我猜:) –

+0

可能重複的[解析json對象](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

我接受你的答案,因爲我終於用了類似的鏈接在問題的評論。這個'DataMember'裝飾器添加了什麼? –

+0

謝謝!我認爲DataMember屬性中的名稱用於將您的JSON屬性映射到您的實例屬性。閱讀更多關於'DataMember' [這裏](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/

有幾個方法可以做到這一點。你可以反序列化一個非常動態而不是嚴格的類型,或者你可以定義一個完全匹配json對象的對象並反序列化到那個對象中。如果有很多JSON格式,你必須序列化,我會推薦使用模式。

1

nekman的回答並不完全正確,該屬性應該是JsonPropery而不是DataMember。 (在這種情況下,你可以刪除該屬性,因爲解串器不關心的大寫的H)

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