Десериализация сложного объекта Json в словарь

#c# #json #deserialization

#c# #json #десериализация

Вопрос:

У меня возникли некоторые проблемы с десериализацией строки Json для использования в оболочке api, которую я сейчас пишу. Это строка json, о которой идет речь:

 {
   "Search":[
      {
         "Title":"Clerks.",
         "Year":"1994",
         "imdbID":"tt0109445",
         "Type":"movie"
      },
      {
         "Title":"Clerks II",
         "Year":"2006",
         "imdbID":"tt0424345",
         "Type":"movie"
      }
   ]
}
  

Это метод, который я в настоящее время использую для его обработки.

 public static Dictionary<string, string> FetchTitlesListDictionary(string searchQuery)
{
    string searchResult = SendRequest(new[] { "?s=", searchQuery });
    JObject parser = JObject.Parse(searchResult);
    var movieDictionary = new Dictionary<string, string>();
    for (int i = 0; i < parser["Search"].Count(); i  )
    {
        if (!movieDictionary.ContainsKey((string)parser["Search"][i]["imdbID"]))
        {
            movieDictionary.Add((string)parser["Search"][i]["imdbID"],
                (string)parser["Search"][i]["Title"]);
        }
    }
    return movieDictionary;
}
  

Несмотря на то, что приведенный выше код работает, я чувствую, что его можно каким-то образом упростить.

Как бы мне добиться этого?

Спасибо!

Ответ №1:

 var obj = JsonConvert.DeserializeObject<RootObject>(searchResult);
  

 public class Search
{
    public string Title { get; set; }
    public string Year { get; set; }
    public string imdbID { get; set; }
    public string Type { get; set; }
}

public class RootObject
{
    public List<Search> Search { get; set; }
}
  

Если вы действительно хотите преобразовать RootObject в словарь, вы можете использовать

 var movieDictionary = obj.Search.ToDictionary(s => s.imdbID, s => s.Title);
  

PS: смотрите этот сайт

Комментарии:

1. Спасибо за ваш ответ и ссылку! Причина, по которой я предпочел бы использовать словарь, заключается в том, что я намерен повторно использовать этот код в будущих проектах. Итак, мне нужно, чтобы этот класс был автономным.

Ответ №2:

Что ж, если вы готовы отказаться от использования сериализатора по умолчанию, я бы просто открыл консоль диспетчера пакетов и ввел

Install-Package ServiceStack.Text

Тогда это становится так просто, как

 var myDictionary = JsonObject.Parse(myJsonString)
          .ArrayObjects("Search")
          .ToDictionary(key => key.Get("imdbID"), value => value.Get("Title"));
  

Возможно, существует аналогичный и столь же простой способ сделать это с помощью сериализатора newtonsoft, но, честно говоря, я никогда им не пользуюсь, поэтому не уверен.

Также то же самое, что и в ответе EZI, это также действительно просто, если у вас есть объекты, которые он создал, тогда вы можете просто

 var myObject = myJsonString.FromJson<RootObject>();

//if you want the dictionary it's the same thing, standard linq
var dictionary = myObject.Search.ToDictionary(x => x.imdbId, x => x.Title);
  

но если все, что вам нужно, это словарь, я бы просто использовал описанный выше метод, это быстро и просто.

Комментарии:

1. Спасибо! Я решил использовать предложенный вами пакет. Это сработало как по волшебству.