我在使用我正在编写的api包装器中使用的Json字符串进行反序列化时遇到了一些麻烦。这是有问题的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;
}
即使上面的代码有效,我觉得它可以在某种程度上变得更简单。
我将如何实现这一目标?
谢谢!
答案 0 :(得分: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:见this site
答案 1 :(得分:0)
好吧,如果你打开不使用默认的序列化程序,我只需打开包管理器控制台并输入
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);
但如果您只需要一本字典,我就会使用上述方法,而且快速而简单。