Разбор вложенного Json с помощью Json.Net

1

Я новичок в 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 Spring Clean-Up",
            "quality":"N/A",
            "status":"Wanted"
         }
      },
      "1923":{  
         "1":{  
            "airdate":"2013-05-16",
            "name":"Alice 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
    С чем именно у вас проблемы? Вы получаете ошибку?
  • 0
    Как выглядят data после десериализации? Это заселено? В вашем RootObject вас есть Dictionary под названием data поэтому вам нужно будет data.data для начала.
Показать ещё 1 комментарий
Теги:

1 ответ

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 намного более лаконичны и читабельны .... используйте их, чтобы продвигаться вперед! (См. Пример ниже). Кроме того, объекты Model не должны содержать бизнес-логики ....
  • 0
    @nterry: кратко? да. Удобочитаемый? очень спорно. Что касается бизнес-логики, здесь нет бизнес-логики. Модели определяют только структуру данных.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню