首页 > 解决方案 > ASP.net 如何解析 JSON

问题描述

我正在尝试让网页返回 iTunes 搜索结果。在查看这里的一些结果以解决类似问题时,我将这段代码放在一起,但是我得到了错误:System.Collections.Generic.KeyNotFoundException:'给定的键不存在于第 41 行的字典中:

string trackName = obj2["trackname"].ToString();

任何帮助是极大的赞赏。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Project4
{
public partial class project4a : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        string choice="";
        if (TextBox1.Equals("Music"))
        {
            choice = "musicTrack";
        }else if (TextBox1.Equals("Movie"))
        {
            choice = "movie";
        }else if (TextBox1.Equals("Software"))
        {
            choice = "software";
        }
        string url = "https://itunes.apple.com/search?term=" + TextBox1.Text.ToString() + "&entity="+choice ; //+DropDownList1.SelectedValue.ToString()
        using (var webClient = new System.Net.WebClient())
        {
            var json = webClient.DownloadString(url);
            //parse
            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            var result = jsSerializer.DeserializeObject(json);
            Dictionary<string, object> obj2 = new Dictionary<string, object>();
            obj2 = (Dictionary<string, object>)(result);

            string trackName = obj2["trackname"].ToString();




            Label3.Text = trackName;

        }
    }
}
}

标签: c#asp.netjsonparsing

解决方案


我认为从 API 调用返回的 json 如下所示:

{ 结果计数:数字,结果:数组 }

因此,字典中有 2 个值,一个用于键“resultCount”,一个用于键“results”。

你想要做的是反序列化结果数组,然后查询:

JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
var result = jsSerializer.DeserializeObject(File.ReadAllText(@"C:\Users\Simon\Downloads\1.txt"));
Dictionary<string, object> obj2 = new Dictionary<string, object>();
obj2 = (Dictionary<string, object>)(result);

object[] resultsList = (object[])obj2["results"];

foreach (var r in resultsList)
{
    Dictionary<string, object> obj3 = (Dictionary<string, object>) r;
    string trackName = obj3["trackName"].ToString();
}

推荐阅读