【问题标题】:How to deserialize JSON array of objects to c# structure如何将JSON对象数组反序列化为c#结构
【发布时间】:2012-12-15 06:13:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: c# asp.net json deserialization


【解决方案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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      为每个 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
      

      【讨论】:

      • 我接受您的回答,因为我终于使用了问题 cmets 中链接中的类似内容。这个 DataMember 装饰器是为了什么而添加的?
      • 谢谢!我认为 DataMember 属性中的名称用于将您的 JSON 属性映射到您的实例属性。阅读更多关于DataMemberhere
      【解决方案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; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        相关资源
        最近更新 更多