0

我有下面的方法来解析来自 twitter 搜索的数据,奇怪的是这个方法在我的一种形式中工作正常,但在我的主要形式中它返回异常:

例外:“System.Collections.Generic.Dictonary”不包含“文本”的定义

这两种形式几乎相同,我不明白为什么我不能让代码工作..有人有什么想法吗?

下面是方法:

public static HashSet<string> searchTwitterJson(string searchTerm)
    {
        HashSet<string> resultsFound = new HashSet<string>();


        if (searchTerm != "")
        {
            string v = searchTerm.Replace("\"", "%22");
            string keyword = v.Trim();
            string keywordet = HttpUtility.UrlEncode(keyword);


            try
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://twitter.com/phoenix_search.phoenix?q=" + keywordet + "&headers[X-Twitter-Polling]=true&headers[X-PHX]=true&since_id=203194965877194752&include_entities=1&include_available_features=1&contributor_details=true&mode=relevance&query_source=unknown");
                var response = request.GetResponse();
                var reader = new StreamReader(response.GetResponseStream());
                var responseString = reader.ReadToEnd();

                string limit = response.Headers["X-RateLimit-Remaining"];


                var serializer = new JavaScriptSerializer();
                serializer.RegisterConverters((new[] { new DynamicJsonConverter() }));
                dynamic obj = serializer.Deserialize(responseString, typeof(object)) as dynamic;

                foreach (var objects in obj.statuses) 
                {
                    if ((objects.text != null) && (objects.user.screen_name != null) && (objects.id_str != null))
                    {
                        Match m = Regex.Match(objects.text, @"(http(s)?://)?([\w-]+\.)+[\w-]+(/\S\w[\w- ;,./?%&=]\S*)?");


                        if (!m.Success)
                        {
                            string loggaD = objects.user.screen_name.ToString() + "/" + objects.id_str.ToString();
                            resultsFound.Add(loggaD);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        else
        {
            MessageBox.Show("No searchterm");
        }

        return resultsFound;
    }

我收到的部分 JSON:

{
    "error": null,
    "statuses": [{
        "in_reply_to_status_id_str": null,
        "id_str": "203239104421445632",
        "truncated": false,
        "possibly_sensitive": false,
        "created_at": "Thu May 17 21:42:33 +0000 2012",
        "in_reply_to_user_id_str": null,
        "contributors": null,
        "favorited": false,
        "geo": null,
        "user": {
            "screen_name": "YouthNorrort"
        },
        "in_reply_to_screen_name": null,
        "coordinates": null,
        "retweet_count": 0,
        "source": "\u003Ca href=\"http:\/\/www.facebook.com\/twitter\" rel=\"nofollow\"\u003EFacebook\u003C\/a\u003E",
        "place": null,
        "in_reply_to_status_id": null,
        "id": 203239104421445632,
        "retweeted": false,
        "in_reply_to_user_id": null,
        "text": "Hejsan igen!\nvi \u00e4r ledsna att meddela er, men inf\u00f6r imorgon s\u00e5 finns det inga bilar, allts\u00e5 inte heller plats f\u00f6r... http:\/\/t.co\/pMKoOz7o",
        "result_category": "recent"
    }
4

1 回答 1

1

该错误表示响应在“状态”下的节点中不包含项目。[i]。检查正在返回的 JSON,如果没有,则无法尝试访问它。

{
    "statuses":
    [
        {
            "text": ...,
            "user: { "screen_name": ... }
        }
    ]
}

编码:

 if ((objects.text != null) && (objects.user.screen_name != null) && (objects.id_str != null))

更新:根据您的 JSON 示例,它工作正常(见下文)。statuses 数组中的所有元素是否都包含“text”成员?

    public static void Test()
    {
        string json = @"{
""error"": null,
""statuses"": [{
    ""in_reply_to_status_id_str"": null,
    ""id_str"": ""203239104421445632"",
    ""truncated"": false,
    ""possibly_sensitive"": false,
    ""created_at"": ""Thu May 17 21:42:33 +0000 2012"",
    ""in_reply_to_user_id_str"": null,
    ""contributors"": null,
    ""favorited"": false,
    ""geo"": null,
    ""user"": {
        ""screen_name"": ""YouthNorrort""
    },
    ""in_reply_to_screen_name"": null,
    ""coordinates"": null,
    ""retweet_count"": 0,
    ""source"": ""\u003Ca href=\""http:\/\/www.facebook.com\/twitter\"" rel=\""nofollow\""\u003EFacebook\u003C\/a\u003E"",
    ""place"": null,
    ""in_reply_to_status_id"": null,
    ""id"": 203239104421445632,
    ""retweeted"": false,
    ""in_reply_to_user_id"": null,
    ""text"": ""Hejsan igen!\nvi \u00e4r ledsna att meddela er, men inf\u00f6r imorgon s\u00e5 finns det inga bilar, allts\u00e5 inte heller plats f\u00f6r... http:\/\/t.co\/pMKoOz7o"",
    ""result_category"": ""recent""
}]}";
        JavaScriptSerializer jss = new JavaScriptSerializer();
        jss.RegisterConverters(new[] { new DynamicJsonConverter() });
        dynamic obj = jss.Deserialize(json, typeof(object)) as dynamic;

        foreach (var objects in obj.statuses)
        {
            Console.WriteLine(objects.GetType());
            if (objects.ContainsKey("text"))
            {
                if ((objects.text != null) && (objects.user.screen_name != null) && (objects.id_str != null))
                {
                    Match m = Regex.Match(objects.text, @"(http(s)?://)?([\w-]+\.)+[\w-]+(/\S\w[\w- ;,./?%&=]\S*)?");

                    if (!m.Success)
                    {
                        string loggaD = objects.user.screen_name.ToString() + "/" + objects.id_str.ToString();
                        Console.WriteLine(loggaD);
                    }
                }
            }
        }

TryInvokeMember 的代码:

            public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
            {
                if (binder.Name == "ContainsKey")
                {
                    result = _dictionary.ContainsKey(args[0] as string);
                    return true;
                }
                else
                {
                    return base.TryInvokeMember(binder, args, out result);
                }
            }
于 2012-05-17T22:50:54.760 回答