我有一个json字符串,它是通过序列化一个对象数组创建的:
[
{
"html": "foo"
},
{
"html": "bar"
}
]
如何将其反序列化为某个可迭代的C#结构?我尝试过这段代码,但我收到No parameterless constructor defined for type of 'System.String'.
错误:
string[] htmlArr = new JavaScriptSerializer().Deserialize<String[]>(html);
我想要获得的是一个可迭代的结构来获取每个'html'对象。
答案 0 :(得分: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
答案 1 :(得分: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 :(得分:2)
docs网站显然现在无法运行......但我会尝试使用JSON.NET(http://james.newtonking.com/projects/json/help/)
有几种方法可以做到。您可以以非常动态的非严格方式反序列化,也可以定义一个与json对象完全匹配的对象,并反序列化为该对象。如果有许多JSON格式你必须序列化我建议使用模式。
答案 3 :(得分: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