在C#中解析JSON数组

5

我正在尝试解析以下的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 - L.B
5个回答

7
只需按原样反序列化JSON并循环即可...
dynamic stuff = JsonConvert.DeserializeObject(json);

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

Fiddle: http://dotnetfiddle.net/0SthDp


7
您可以创建一个类似这样的类,来接受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属性,因为您不能在C#中将json字符串中的名称用作属性。

然后只需调用以下行:

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

你将得到一个与json字符串匹配的强类型对象列表。


1

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

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方法。
此外,请记住使用JsonProperty属性来指定实际属性名称,如JSON字符串中所指定的那样,如果您不能/不打算创建与JSON中完全相同的字段名称。

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);
}

0
第一层级 - stuff - 是一个对象的数组。这些对象或者说是该数组中的元素包含了一个timestamp字段。
请考虑以下内容:
dynamic items = JsonConvert.DeserializeObject(json);
foreach(dynamic item in items) {
   /* use item.timestamp */
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接