2012-02-11 5 views
1

Попытка десериализовать следующий JSON в объект .NET с использованием Json.Net не работает так, как предполагалось. Обычно десериализация обычно не является серьезным осложнением, но структура следующего JSON не так прямолинейна.Deserialize 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 вы используете? –

ответ

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 к 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>())); 
     } 
    } 
} 
Смежные вопросы