2014-10-06 125 views
1

我是Json的新手,並試圖瞭解如何使用Json.Net解析它。我試圖爲我的JSON輸入創建對象,但我被卡住了。我不太清楚如何解析輸入,所以我可以遍歷它並輸出季節數字和劇集名稱。使用Json.Net解析嵌套的Json

任何人都可以指出我正確的方向嗎?

JSON:

{ 
    "data":{ 
     "1921":{ 
     "1":{ 
      "airdate":"1921-03-20", 
      "name":"Cleaning Up!!?", 
      "quality":"N/A", 
      "status":"Wanted" 
     }, 
     "2":{ 
      "airdate":"1921-03-20", 
      "name":"Kansas City Girls Are Rolling Their Own Now", 
      "quality":"N/A", 
      "status":"Wanted" 
     }, 
     "3":{ 
      "airdate":"1921-03-20", 
      "name":"Did You Ever Take a Ride Over Kansas City Street 'in a Fliver'", 
      "quality":"N/A", 
      "status":"Wanted" 
     }, 
     "4":{ 
      "airdate":"1921-03-20", 
      "name":"Kansas City's Spring Clean-Up", 
      "quality":"N/A", 
      "status":"Wanted" 
     } 
     }, 
     "1923":{ 
     "1":{ 
      "airdate":"2013-05-16", 
      "name":"Alice's Wonderland - aka - Alice in Slumberland", 
      "quality":"Unknown", 
      "status":"Downloaded" 
     } 
     } 
    }, 
    "message":"", 
    "result":"success" 
} 

代碼:

static void Main(string[] args) 
     { 
      RootObject data = JsonConvert.DeserializeObject<RootObject>(System.IO.File.ReadAllText(@"C:\Users\Benjamin\Desktop\json\input.txt")); 
      foreach (var e in data) 
      { 
       // Being able to output Season and Episode name like: 
       // 1921 - Cleaning Up!!? 
      } 
     } 

     public class RootObject 
     { 
      public Dictionary<int, Season> data { get; set; } 
      public string message { get; set; } 
      public string result { get; set; } 
     } 

     public class Season 
     { 
      public Dictionary<string, Episode> number { get; set; } 
     } 

     public class Episode 
     { 
      public string airdate { get; set; } 
      public string name { get; set; } 
      public string quality { get; set; } 
      public string status { get; set; } 
     } 
+1

你究竟在遇到什麼麻煩?你有錯誤嗎? – mason 2014-10-06 19:41:20

+0

反序列化後數據的外觀如何?它是否填充?在你的'RootObject'中,你有一個名爲'data'的Dictionary,所以你需要迭代'data.data'開始。 – 2014-10-06 19:42:28

+0

是的,RootObject是否填充?你是否遇到異常?你的代碼看起來正確。 – nterry 2014-10-06 19:46:01

回答

2

有了改變你RootObject

public class RootObject 
{ 
    public Dictionary<int, Dictionary<string, Episode>> data { get; set; } 
    public string message { get; set; } 
    public string result { get; set; } 
} 

然後你可以這樣做:

RootObject root = JsonConvert.DeserializeObject<RootObject>(data); 
foreach (var s in root.data) 
{ 
    foreach (var e in s.Value) 
    { 
     Console.WriteLine(string.Format("{0} - {1}", s.Key, e.Value.name)); 
     // access whatever properties you want here... 
    } 
} 

請注意,我們已經刪除了Season對象,因爲JSON.net無法映射到屬性number,因爲這不是原始JSON中的屬性(您可以使其工作,但它需要一些擺弄自定義序列化)。

如果你真的想LINQ的解決方案,則是這樣的:

root.data.ToList().ForEach(s => 
{ 
    s.Value.ToList().ForEach(e => 
    { 
     Console.WriteLine(string.Format("{0} - {1}", s.Key, e.Value.name)); 
    }); 
}); 

達到同樣的事情,但需要複製你的字典到,如果你的字典是非常大的,這可能是一個問題的列表。

+0

LINQ與Lambdas是一個更簡潔可讀的....使用它們來提前! (請參閱下面的示例)。此外,模型對象不應該有他們的業務邏輯.... – nterry 2014-10-06 19:52:29

+0

@ nterry:簡明?是。可讀? *非常值得商榷*。至於業務邏輯,這裏沒有業務邏輯。這些模型僅僅定義了數據的結構。 – 2014-10-06 19:54:37

+0

Linq非常可讀。你只需要習慣它。如果ForEach不可用,只需使用Select。 – nterry 2014-10-06 20:06:01