#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. Спасибо! Я решил использовать предложенный вами пакет. Это сработало как по волшебству.