我正在尝试解析以下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
但我正在努力解决如何将各个元素放入数组中以进行循环。
我虽然关于分裂刺痛},{但没有太多运气。我想有一种我更容易丢失的方式。
谢谢。
答案 0 :(得分:2)
按原样反序列化JSON并循环播放...
dynamic stuff = JsonConvert.DeserializeObject(json);
foreach (var s in stuff)
{
Console.WriteLine(s.timestamp);
}
答案 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; }
}
您可以注意到JsonProperty
和smtpid
属性上有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字符串中指定的实际属性名称。