2014-02-23 119 views
0

我试图解析以下JSON数组解析JSON阵列在C#

[ 
    { 
     "email": "[email protected]", 
     "timestamp": 1337197600, 
     "smtp-id": "<[email protected]>", 
     "event": "processed" 
    }, 
    { 
     "email": "[email protected]", 
     "timestamp": 1337966815, 
     "smtp-id": "<[email protected]>", 
     "category": "newuser", 
     "event": "clicked" 
    }, 
    { 
     "email": "[email protected]", 
     "timestamp": 1337969592, 
     "smtp-id": "<[email protected]>", 
     "event": "processed" 
    } 
] 

我没有真正使用过JSON格式,所以这一切都有点新意。我发现我可以很容易地解析单个元件,即

{ 
     "email": "[email protected]", 
     "timestamp": 1337197600, 
     "smtp-id": "<[email protected]>", 
     "event": "processed" 
} 

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

但我与如何通过获得各个元件成阵列循环挣扎。

我虽然关于分裂蜇},{但没有太多的运气。我想我有一个更简单的方法,我错过了。

谢谢。

+0

* stuff *是一个数组。使用'stuff [i] .timestamp' –

回答

0

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

考虑以下几点:

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

只是反序列化JSON作为是和循环它...

dynamic stuff = JsonConvert.DeserializeObject(json); 

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

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

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

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

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

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

正如你可以看到有关于smtpidevt性能JsonProperty属性,因为你不能使用json字符串中的名称作为C#中的属性。

然后,只需调用下面一行:

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

,你会得到的JSON字符串匹配对象的强类型列表。