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

时间:2014-07-06 00:43:01

标签: c# json deserialization

我在使用我正在编写的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;
}

即使上面的代码有效,我觉得它可以在某种程度上变得更简单。

我将如何实现这一目标?

谢谢!

2 个答案:

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

但如果您只需要一本字典,我就会使用上述方法,而且快速而简单。