Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将对象的JSON数组反序列化为c#结构_C#_Asp.net_Json_Deserialization - Fatal编程技术网

如何将对象的JSON数组反序列化为c#结构

如何将对象的JSON数组反序列化为c#结构,c#,asp.net,json,deserialization,C#,Asp.net,Json,Deserialization,我有一个json字符串,它是通过序列化对象数组创建的: [ { "html": "foo" }, { "html": "bar" } ] 如何将其反序列化为某种可移植的C#结构?我已经尝试了这段代码,但是我得到的没有为'System.String'类型定义无参数构造函数。错误: string[] htmlArr = new JavaScriptSerializer().Deserialize<String[]>(htm

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

[
    {
        "html": "foo"
    },
    {
        "html": "bar"
    }
]
如何将其反序列化为某种可移植的C#结构?我已经尝试了这段代码,但是我得到的
没有为'System.String'类型定义无参数构造函数。
错误:

string[] htmlArr = new JavaScriptSerializer().Deserialize<String[]>(html);
string[]htmlar=newJavaScriptSerializer()。反序列化(html);
我想要得到的是一个iterable结构,用于获取每个“html”对象。

您可以使用(可从NuGet获得)


为每个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
公共类HtmlItem
{
[DataMember(Name=“html”)]
公共字符串Html{get;set;}
}
JavaScriptSerializer ser=新的JavaScriptSerializer();
//连载
字符串html=ser.Serialize(新列表{
新的HtmlItem{Html=“foo”},
新的HtmlItem{Html=“bar”}
});
//反序列化并打印html项目。
列表htmlist=ser.Deserialize(html);
htmlist.ForEach((item)=>Console.WriteLine(item.Html));//富吧

文档网站显然现在不起作用。。。但是我会尝试使用JSON.NET()


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

nekman的回答不完全正确,属性应该是JSONProperty而不是DataMember。(在这种情况下,您可以删除该属性,因为反序列化程序不关心大写字母H)

公共类HtmlItem
{
[JsonProperty(“html”)]
公共字符串Html{get;set;}
}
JavaScriptSerializer ser=新的JavaScriptSerializer();
//连载
字符串html=ser.Serialize(新列表{
新的HtmlItem{Html=“foo”},
新的HtmlItem{Html=“bar”}
});
//反序列化并打印html项目。
列表htmlist=ser.Deserialize(html);
htmlist.ForEach((item)=>Console.WriteLine(item.Html));//富吧

签出上一篇stackoverflow帖子,或者感谢您提供的链接,我第一次尝试这样做时没有创建额外的类,但我想我可以这样做:)可能重复我接受您的答案,因为我最终在问题注释中使用了类似的链接。添加此
DataMember
decorator的目的是什么?谢谢!我认为DataMember属性中的名称用于将JSON属性映射到实例属性。阅读有关
DataMember
public class Item
{
    public string Html { get; set; }
}
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
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