9

我有一个通过序列化对象数组创建的 json 字符串:

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

如何将其反序列化为一些可迭代的 C# 结构?我试过这段代码,但我收到No parameterless constructor defined for type of 'System.String'.错误:

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

我想要接收的是一个可迭代的结构来获取每个“html”对象。

4

4 回答 4

11

为每个 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
于 2012-12-30T23:14:50.687 回答
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; }
}
于 2012-12-30T23:13:19.237 回答
2

文档站点现在显然无法正常工作......但我会尝试使用 JSON.NET ( http://james.newtonking.com/projects/json/help/ )

有几种方法可以做到这一点。您可以以一种非常动态的非严格类型的方式反序列化,或者您可以定义一个与 json 对象完全匹配的对象并反序列化为该对象。如果有多种格式的 JSON,您必须进行序列化,我建议您使用模式。

于 2012-12-30T23:15:14.697 回答
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
于 2013-06-28T09:43:53.237 回答