将复杂Json对象反序列化为字典
本文关键字:字典 反序列化 对象 复杂 Json | 更新日期: 2023-09-27 18:11:31
我在反序列化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;
}
尽管上面的代码可以工作,但我觉得它可以更简单。
我该怎么做呢?
谢谢!
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:参见本网站
好吧,如果你愿意不使用默认的序列化器,我会打开包管理器控制台,输入
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);
但是如果你只需要一本字典,我就会使用上面的方法,它又快又简单。