【问题标题】:Parse JSON array in C#在 C# 中解析 JSON 数组
【发布时间】:2014-02-23 20:23:28
【问题描述】:

我正在尝试解析以下 json 数组

[
    {
        "email": "john.doe@sendgrid.com",
        "timestamp": 1337197600,
        "smtp-id": "<4FB4041F.6080505@sendgrid.com>",
        "event": "processed"
    },
    {
        "email": "john.doe@sendgrid.com",
        "timestamp": 1337966815,
        "smtp-id": "<4FBFC0DD.5040601@sendgrid.com>",
        "category": "newuser",
        "event": "clicked"
    },
    {
        "email": "john.doe@sendgrid.com",
        "timestamp": 1337969592,
        "smtp-id": "<20120525181309.C1A9B40405B3@Example-Mac.local>",
        "event": "processed"
    }
]

我之前没有真正使用过json格式,所以有点新。我发现我可以轻松解析单个元素,即

{
        "email": "john.doe@sendgrid.com",
        "timestamp": 1337197600,
        "smtp-id": "<4FB4041F.6080505@sendgrid.com>",
        "event": "processed"
}

dynamic stuff = JsonConvert.DeserializeObject(json);
Response.Write(string.Format("{0} = {1}<br />", "timestamp", stuff.timestamp)); 
//etc

但我正在努力解决如何将单个元素放入一个数组中进行循环。

我虽然想在 },{ 上拆分刺痛,但没有太多运气。我想我错过了一种更简单的方法。

谢谢。

【问题讨论】:

  • stuff 是一个数组。使用stuff[i].timestamp

标签: c# asp.net json


【解决方案1】:

只需按原样反序列化 JSON 并循环它...

dynamic stuff = JsonConvert.DeserializeObject(json);

foreach (var s in stuff) 
{
     Console.WriteLine(s.timestamp);
}

小提琴:http://dotnetfiddle.net/0SthDp

【讨论】:

    【解决方案2】:

    您可以创建一个类似这样的类,以接受 json 字符串中的所有属性:

    public class MyClass
    {
        public string email { get; set; }
    
        public long timestamp { get; set; }
    
        [JsonProperty("smtp-id")]
        public string smtpid { get; set; }
    
        public string category { get; set; }
    
        [JsonProperty("event")]
        public string evt { get; set; }
    }
    

    您可以注意到smtpidevt 属性上有JsonProperty 属性,因为您不能将json 字符串中的名称用作C# 中的属性。

    然后只需调用以下行:

    var list = JsonConvert.DeserializeObject<List<MyClass>>(json);
    

    您将获得与 json 字符串匹配的强类型对象列表。

    【讨论】:

      【解决方案3】:

      使用JSON.Net 为您执行此操作:

      创建一个类来保存数据(注意我放在 smtp-id 上的属性来处理 C# 不喜欢的字符):

      public class EmailEvent
      {
          public string Email { get; set; }
          public int TimeStamp { get; set; }
      
          [Newtonsoft.Json.JsonProperty(PropertyName="smtp-id")]
          public string SmtpId { get; set; }
          public string Event { get; set; }
          public string Category { get; set; }
      }
      

      然后反序列化它:

      var events = Newtonsoft.Json.JsonConvert.DeserializeObject<List<EmailEvent>>(System.IO.File.ReadAllText(@"z:\temp\test.json"));
      
      foreach (var ev in events)
      {
          Console.WriteLine(ev.SmtpId);
      }
      

      【讨论】:

        【解决方案4】:

        创建这两个类来保存您的数据:

        public class SMTPEvent {
            public string Email { get; set; }
            public long TimeStamp { get; set; }
            public string SmtpId { get; set; }
            public string EventType { get; set; }
        }
        
        public class SMTPEvents {
            public List<SMTPEvent> Events { get; set; }
        }
        

        然后你可以调用如下:

        dynamic stuff = JsonConvert.DeserializeObject<SMTPEvents>(json);
        

        要进行迭代,您可以使用:

        foreach(SMTPEvent sEvent in stuff)
        {
            //whatever you want to do.
        }
        

        这种方法的优点是在运行时具有更高的类型安全性,同时如果您要在系统的其他部分使用可重用对象的话。如果没有,您可能希望使用其他人建议的更简单的 dynamic 方法。

        此外,如果您不能/不打算创建与 JSON 中名称完全相同的字段,请记住使用 JsonProperty 属性来指定 JSON 字符串中指定的实际属性名称。

        【讨论】:

          【解决方案5】:

          第一层 - stuff - 是一个 Array 对象。它是所述数组中的对象或元素,其中包含timestamp 字段。

          考虑以下几点:

          dynamic items = JsonConvert.DeserializeObject(json);
          foreach(dynamic item in items) {
             /* use item.timestamp */
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-09-27
            • 1970-01-01
            • 2016-03-28
            相关资源
            最近更新 更多