使用Json.Net解析嵌套的Json

时间:2014-10-06 19:38:19

标签: c# json

我是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 个答案:

答案 0 :(得分: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));
    });
});

实现同样的目标,但需要将字典复制到列表中,如果字典非常大,可能会出现问题。