在C#中解析JSON数组

时间:2014-02-23 20:23:28

标签: c# asp.net json

我正在尝试解析以下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

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

我虽然关于分裂刺痛},{但没有太多运气。我想有一种我更容易丢失的方式。

谢谢。

5 个答案:

答案 0 :(得分:2)

按原样反序列化JSON并循环播放...

dynamic stuff = JsonConvert.DeserializeObject(json);

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

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

答案 1 :(得分:1)

您可以创建类似这样的类,以接受来自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; }
}

您可以注意到JsonPropertysmtpid属性上有evt属性,因为您无法将json字符串中的名称用作C#中的属性1}}。

然后只需拨打以下一行:

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

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

答案 2 :(得分:0)

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

请考虑以下事项:

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

答案 3 :(得分:0)

使用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 :(得分:0)

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

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字符串中指定的实际属性名称。