使用Json.Net解析嵌套的Json
问题描述:
我是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; }
}
答
有了改变你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));
});
});
达到同样的事情,但需要复制你的字典到,如果你的字典是非常大的,这可能是一个问题的列表。
你究竟在遇到什么麻烦?你有错误吗? – mason 2014-10-06 19:41:20
反序列化后数据的外观如何?它是否填充?在你的'RootObject'中,你有一个名为'data'的Dictionary,所以你需要迭代'data.data'开始。 – 2014-10-06 19:42:28
是的,RootObject是否填充?你是否遇到异常?你的代码看起来正确。 – nterry 2014-10-06 19:46:01