将JsonObjects反序列化为.NET对象
问题描述:
尝试使用Json.Net将以下JSON反序列化为.NET对象并不是按预期工作。反序列化通常不是一个主要的复杂问题,但是下面的JSON的结构并不那么简单。将JsonObjects反序列化为.NET对象
JSON:
{
"33": {
"0": {
"StopName": "JFK Blvd & 15th St",
"Route": "33",
"date": "11:24p",
"day": "Fri",
"Direction": "1",
"DateCalender": "02/10/12 11:24 pm"
},
"3": {
"StopName": "JFK Blvd & 15th St",
"Route": "33",
"date": "11:52p",
"day": "Fri",
"Direction": "1",
"DateCalender": "02/10/12 11:52 pm"
}
},
"32": {
"1": {
"StopName": "JFK Blvd & 15th St",
"Route": "32",
"date": "11:30p",
"day": "Fri",
"Direction": "1",
"DateCalender": "02/10/12 11:30 pm"
}
},
"17": {
"2": {
"StopName": "JFK Blvd & 15th St",
"Route": "17",
"date": "11:38p",
"day": "Fri",
"Direction": "1",
"DateCalender": "02/10/12 11:38 pm"
}
}
}
并发症从 “33” 的结果, “32”, “17” 代表路线编号。这些数字可能会随着结果集中的路线变化而改变。我确定我需要为此编写一个自定义的JSON转换器,但是我无法找到任何明确的信息来完成此任务(因为没有人在属性名称是动态的情况下出现问题) 。
我也尝试使用JSON.NET LINQ到JSON,而是因为你需要使用类似的代码如下访问JSON这是不可行的:因为我没有真实的想法
JObject o = JObject.Parse(e.Result);
o["33"];
看看属性名称是什么,我不能轻易地遍历这个对象。
答
您的JSON格式:
{
"33": { <-- This is MainRoute number
"0": { <-- This is SubRoute number and below are SubRoute properties
"StopName": "JFK Blvd & 15th St",
"Route": "33",
"date": "11:24p",
"day": "Fri",
"Direction": "1",
"DateCalender": "02/10/12 11:24 pm"
},
....
}
您可以使用JObject
解析您的JSON数据:
public class MainRoute {
public int RouteNumber { get; set; }
public IList<SubRoute> SubRoutes { get; set; }
public MainRoute()
{
SubRoutes = new List<SubRoute>();
}
}
public class SubRoute {
public int RouteNumber { get; set; }
public string StopName { get; set; }
public int Route { get; set; }
[JsonProperty("date")]
public string Date { get; set; }
[JsonProperty("day")]
public string Day { get; set; }
public int Direction { get; set; }
[JsonProperty("DateCalender")]
public string DateCalendar { get; set; }
}
class Program {
static void Main(string[] args)
{
string jsonString = FetchJsonData();
var routes = ParseRouteJsonString(jsonString);
}
static IEnumerable<MainRoute> ParseRouteJsonString(string jsonString)
{
JObject jsonObject = JObject.Parse(jsonString);
foreach (KeyValuePair<string, JToken> pair in jsonObject) {
var mainRoute = new MainRoute() {
RouteNumber = Int32.Parse(pair.Key) // Get main route number.
};
foreach (JProperty property in pair.Value) {
var subRoute = property.Value.ToObject<SubRoute>();
subRoute.RouteNumber = Int32.Parse(property.Name); // Get sub route number.
mainRoute.SubRoutes.Add(subRoute);
}
yield return mainRoute;
}
}
}
答
下面是如何通过使用LINQ to JSON路由迭代一个小样本:
var main = JObject.Parse(json);
foreach (var mainRoute in main.Properties())
{
Console.WriteLine(mainRoute.Name); //33, 32, ...
foreach (var subRoute in mainRoute.Values<JObject>().SelectMany(x => x.Properties()))
{
Console.WriteLine(" " + subRoute.Name); //0, 3, ...
var routeData = subRoute.Value as JObject;
foreach (var dataItem in routeData.Properties())
{
Console.WriteLine(string.Format(" {0} = {1}", dataItem.Name, dataItem.Value.Value<string>()));
}
}
}
您正在使用哪个版本的.NET? – 2012-02-11 06:03:03