2014-10-06 2 views
1

Я новичок в Json и пытаюсь понять, как я могу разобрать его с помощью Json.Net. Я пытался создать объекты для ввода json, но я застрял. Я не совсем уверен, как анализировать входные данные, чтобы я мог перебирать его и выводить номера сезона и имя эпизода.Анализ вложенных Json с использованием Json.Net

Любой, кто может указать мне в правильном направлении?

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

С чем именно вы столкнулись? Вы получаете сообщение об ошибке? – mason

+0

Как выглядит «данные» после десериализации? Заселено ли оно? В вашем «RootObject» у вас есть «Словарь», называемый 'data', поэтому вам нужно будет перебирать' data.data' для начала. –

+0

Да, есть ли RootObject? Вы получаете исключение? Ваш код выглядит правильно. – nterry

ответ

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)); 
    }); 
}); 

Достигает то же самое, но требует копирования вашего словаря в список, который может быть проблемой, если ваш словарь очень велик.

+0

LINQ с Lambdas являются более лаконичными и читаемыми .... используйте их, чтобы продвигаться вперед! (См. Ниже пример). Кроме того, объекты модели не должны иметь в них бизнес-логики. – nterry

+0

@nterry: Concise? да. Удобочитаемый? * очень спорный *. Что касается бизнес-логики, здесь нет бизнес-логики. Модели определяют только способ структурирования данных. –

+0

Linq очень читабельна. Вам просто нужно привыкнуть к этому. просто используйте Select, если ForEach не доступен. – nterry

Смежные вопросы