2012-02-11 139 views
1

尝试使用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"]; 

看看属性名称是什么,我不能轻易地遍历这个对象。

+0

您正在使用哪个版本的.NET? – 2012-02-11 06:03:03

回答

3

您的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; 
       } 
     } 
} 
3

下面是如何通过使用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>())); 
     } 
    } 
}