2014-02-23 118 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字符串匹配對象的強類型列表。