将复杂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;
}

尽管上面的代码可以工作,但我觉得它可以更简单。

我该怎么做呢?

谢谢!

将复杂Json对象反序列化为字典

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);

但是如果你只需要一本字典,我就会使用上面的方法,它又快又简单。